zoukankan      html  css  js  c++  java
  • BestCoder Round #81 (div.2)

    HDU:5670~5764

    A题: 是一个3进制计数;

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int a[100000];
     6 
     7 int calc(long long n) {
     8     int i=0;
     9     while(n) {
    10         a[i++] = n%3;
    11         n/=3;
    12     }
    13     return i;
    14 }
    15 
    16 int main()
    17 {
    18     int t;
    19     cin>>t;
    20     while(t--) {
    21         memset(a,0,sizeof(0));
    22         int m;  //长度
    23         long long n;
    24         cin>>m>>n;
    25         int k = calc(n);
    26         for(int i=0;i<m-k;i++) {
    27             putchar('R');
    28         }
    29         for(int i=min(k-1,m-1);i>=0;i--) {
    30             if(a[i]==0)
    31                 putchar('R');
    32             else if(a[i]==1)
    33                 putchar('G');
    34             else putchar('B');
    35         }
    36         puts("");
    37     }
    38     return 0;
    39 }
    View Code

    B题:矩阵操作,可以线段树,有更好的办法,就是现在的某一行是原来的哪一行记录下来;

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int maxn = 1005;
     6 int maps[maxn][maxn];
     7 
     8 int r[maxn];    //当前的第i 行,是原来的r[i]
     9 int c[maxn];
    10 int addr[maxn]; //当前的第i 行,上面加了addr[i]
    11 int addc[maxn];
    12 
    13 int main()
    14 {
    15     int t;
    16     scanf("%d",&t);
    17     while(t--) {
    18         memset(addr,0,sizeof(addr));
    19         memset(addc,0,sizeof(addc));
    20 
    21         int n,m;
    22         int q;
    23         scanf("%d%d%d",&n,&m,&q);
    24         for(int i=0;i<n;i++)
    25             for(int j=0;j<m;j++)
    26                 scanf("%d",&maps[i][j]);
    27 
    28         for(int i=0;i<n;i++)
    29             r[i] = i;
    30         for(int i=0;i<m;i++)
    31             c[i] = i;
    32 
    33         int op,x,y;
    34         while(q--) {
    35             scanf("%d%d%d",&op,&x,&y);
    36             if(op==1)
    37             {
    38                 x--;y--;
    39                 swap(r[x],r[y]);
    40                 swap(addr[x],addr[y]);
    41             }
    42             if(op==2) {
    43                 x--;y--;
    44                 swap(c[x],c[y]);
    45                 swap(addc[x],addc[y]);
    46             }
    47             if(op==3) {
    48                 x--;
    49                 addr[x]+=y;
    50             }
    51             if(op==4) {
    52                 x--;
    53                 addc[x]+=y;
    54             }
    55         }
    56 
    57         for(int i=0;i<n;i++) {
    58             for(int j=0;j<m;j++) {
    59                 if(j==m-1)
    60                     printf("%d",maps[r[i]][c[j]]+addr[i]+addc[j]);
    61                 else
    62                     printf("%d ",maps[r[i]][c[j]]+addr[i]+addc[j]);
    63             }
    64             puts("");
    65         }
    66     }
    67     return 0;
    68 }
    View Code

    C题:一个字符串,仅有小写字母,求有多少个子串,至少K个不同的字母;

    尺取,最好是hash,map,set可能会超时

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int maxn = 1000000+5;
     6 
     7 char str[maxn];
     8 int vis[300];
     9 
    10 int main()
    11 {
    12     int t;
    13     cin>>t;
    14     while(t--) {
    15         int k;
    16         scanf("%s%d",str+1,&k);
    17         int n = strlen(str+1);
    18         memset(vis,0,sizeof(vis));
    19         int r=0;
    20         int cnt=0;
    21         long long ans = 0;
    22         for(int l=1;l<=n;l++) {
    23             while(r<n&&cnt<k) {
    24                 ++r;
    25                 if(++vis[str[r]]==1)
    26                     cnt++;
    27             }
    28             if(cnt>=k)
    29                 ans +=n-r+1;
    30             if(--vis[str[l]]==0)
    31                 --cnt;
    32         }
    33         cout<<ans<<endl;
    34     }
    35     return 0;
    36 }
    View Code

    D题:  n秒后,回到原点,有多少不同的路径;

    枚举向右走了几步;

    公式出来了,大组合数用到乘法逆元,求卡特兰数,在CSUFTOJ中有一个出栈序列的问题,i 步有多少种出栈方式;(代码还没写)

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6879622.html
Copyright © 2011-2022 走看看