codeforces 792A-D

先刷前四題,剩下的有空補。ide

792A New Bus Route函數

題意:給出x 軸上的n 個點,問兩個點之間的最短距離是多少,有多少個最短距離。編碼

思路:排序後遍歷。spa

代碼:code

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 #define N 200005
 5 int w[N];
 6 int main(){
 7   int n;
 8   while(~scanf("%d", &n)){
 9     for(int i=0; i<n; i++){
10       scanf("%d", &w[i]);
11     }
12     sort(w, w+n);
13     int mint=w[1]-w[0], co=1;
14     for(int i=2; i<n; i++){
15       if(w[i]-w[i-1]<mint){
16         mint=w[i]-w[i-1];
17         co=1;
18       }
19       else if(w[i]-w[i-1]==mint) co++;
20     }
21     printf("%d %d\n", mint, co);
22   }
23   return 0;
24 }
792A AC代碼

792B Counting-out Rhymeblog

題意:1-n n個數圍成一圈,初始位置爲1,有m 個操做,每一個操做給一個整數x,表示前進x 步後刪去當前位置的數,再前進一步,輸出每次操做刪除的數排序

思路:模擬,用pos表示當前位置,循環m 次。注意獲得x 後先取餘當前剩餘數量。get

代碼:string

 1 #include<stdio.h>
 2 
 3 int main(){
 4   int n, m, x;
 5   while(~scanf("%d%d", &n, &m)){
 6     bool vis[110]={0}, flag=false;
 7     int pos=0, num=n;
 8     while(m--){
 9       scanf("%d", &x);
10       x=x%num;
11       while(x--){
12         do
13         {
14           pos++;
15           pos%=n;
16         }while(vis[pos]==1);
17       }
18       if(flag) printf(" ");
19       flag=true;
20       printf("%d", pos+1);
21       vis[pos]=1;
22       do
23       {
24         pos++;
25         pos%=n;
26       }while(vis[pos]==1);
27       num--;
28     }
29     printf("\n");
30   }
31   return 0;
32 }
792B AC代碼

792C Divide by Threeit

題意:給一個數,問最少刪除多少位後能夠被3 整除。

思路:

  有一個大數取餘要先理解。用sum 保存全部位和取餘3 的結果。

  若是sum==0,不須要刪除;

  若是sum==1,有可能刪除一位1(取餘後),有可能刪除兩位2;

  若是sum==2,有可能刪除一位2,有可能刪除兩位1。 

  寫一個函數del(char *s, int k)表示從s 裏刪除一個數字k 而且去除前導0。接着幾個if、else判斷一下就能夠了。

代碼:

 1 #include<stdio.h>
 2 #include<string.h>
 3 void del(char *s, int k){
 4   int ls=strlen(s), i;
 5   for(i=ls-1; i>=0; i--){
 6     if((s[i]-'0')%3==k) break;
 7   }
 8   if(i==-1) return ;
 9   for(int j=i; j<ls; j++) s[j]=s[j+1];
10   if(s[0]==0){
11     s[0]='-';
12     s[1]='1';
13     s[2]=0;
14     return ;
15   }
16   for(i=0; s[i]; i++){
17     if(s[i]!='0') break;
18   }
19   if(s[i]==0) s[0]='0', s[1]=0;
20   else{
21     for(int j=i; j<ls; j++){
22       s[j-i]=s[j];
23     }
24   }
25 }
26 char s[100005], ts[100005];
27 int main(){
28   while(~scanf("%s", s)){
29     int sum=0;
30     for(int i=0; s[i]; i++){
31       sum+=s[i]-'0';
32       sum%=3;
33     }
34     if(sum==0) printf("%s\n", s);
35     else{
36       int n1=0, n2=0;
37       for(int i=0; s[i]; i++){
38         if((s[i]-'0')%3==1) n1++;
39         else if((s[i]-'0')%3==2) n2++;
40       }
41       if(sum==1){
42         if(n2<2){
43           del(s, 1);
44           printf("%s\n", s);
45         }
46         else if(n1==0){
47           del(s, 2);
48           del(s, 2);
49           printf("%s\n", s);
50         }
51         else{
52           strcpy(ts, s);
53           int ls1, ls2;
54           del(ts, 1);
55           ls1=strlen(ts);
56           del(s, 2);
57           del(s, 2);
58           ls2=strlen(s);
59           if(ls1>ls2) printf("%s\n", ts);
60           else printf("%s\n", s);
61         }
62       }
63       else{
64         if(n2==0){
65           del(s, 1);
66           del(s, 1);
67           printf("%s\n", s);
68         }
69         else if(n1<2){
70           del(s, 2);
71           printf("%s\n", s);
72         }
73         else{
74           strcpy(ts, s);
75           int ls1, ls2;
76           del(ts, 1);
77           del(ts, 1);
78           ls1=strlen(ts);
79           del(s, 2);
80           ls2=strlen(s);
81           if(ls1>ls2) printf("%s\n", ts);
82           else printf("%s\n", s);
83         }
84       }
85     }
86   }
87   return 0;
88 }
792C AC代碼

792D Paths in a Complete Binary Tree

題意:給一個n ,一個m ,n 表示有n 個結點的完整二叉樹,m 表示m 個詢問,每次詢問給出初始結點編號和移動序列,問移動後的結點編號。(樹結點編碼依據中序遍歷)

思路:

  預處理+模擬。

  能夠先經過一個dfs找到初始位置的層數,這個dfs裏面同時求出初始位置到根的路徑(用於判斷當前位置是父結點的左孩子或右孩子)。

  接着根據初始位置的層數,先預處理一下移動序列,把不合理的操做去掉。(簡化後續操做難度)

  接着模擬當前位置變化便可。分三種狀況處理便可(重點的子樹結點數量能夠經過當前層數求出)

代碼:

  1 #include<stdio.h>
  2 #define LL long long
  3 
  4 int getNum(LL n){
  5   int ret=0;
  6   while(n){
  7     n>>=1;
  8     ret++;
  9   }
 10   return ret;
 11 }
 12 
 13 int dfs(LL l, LL r, LL p, bool *ss, int &ssp, int ceng){  // 肯定初始位置的行
 14   LL mid=(l+r)/2;
 15   if(mid==p) return ceng;
 16   else if(mid>p){
 17     ss[ceng]=0;
 18     ssp=ceng;
 19     return dfs(l, mid-1, p, ss, ssp, ceng+1);
 20   }
 21   else{
 22     ss[ceng]=1;
 23     ssp=ceng;
 24     return dfs(mid+1, r, p, ss, ssp, ceng+1);
 25   }
 26 }
 27 
 28 void init(char *s, int rp, int num){
 29   int j=0;
 30   for(int i=0; s[i]; i++){
 31     if(s[i]=='L' || s[i]=='R'){
 32       if(rp==num);
 33       else{
 34         rp++;
 35         s[j++]=s[i];
 36       }
 37     }
 38     else{
 39       if(rp==1);
 40       else{
 41         rp--;
 42         s[j++]=s[i];
 43       }
 44     }
 45   }
 46   s[j]=0;
 47 }
 48 
 49 LL dp[100];
 50 LL solve(char *s, bool *ss, int ssp, LL p, int rp, int num){
 51   if(s[0]==0) return p;
 52   if(s[0]=='L'){
 53     LL ln=dp[num-rp]-1;
 54     p=p-ln+(ln-1)/2;
 55     rp++;
 56     ss[++ssp]=0;
 57   }
 58   else if(s[0]=='R'){
 59     LL rn=dp[num-rp]-1;
 60     p=p+1+(rn-1)/2;
 61     rp++;
 62     ss[++ssp]=1;
 63   }
 64   else{
 65     if(ss[ssp]==0){
 66       LL rn=dp[num-rp]-1;
 67       p=p+1+rn;
 68     }
 69     else{
 70       LL ln=dp[num-rp]-1;
 71       p=p-1-ln;
 72     }
 73     ssp--;
 74     rp--;
 75   }
 76 
 77   return solve(s+1, ss, ssp, p, rp, num);
 78 }
 79 
 80 char s[100005];
 81 bool ss[100];
 82 int main(){
 83   dp[0]=1;
 84   for(int i=1; dp[i-1]<=1e18; i++){
 85     dp[i]=dp[i-1]*2;
 86   }
 87   LL n, p;
 88   int m;
 89   while(~scanf("%I64d%d", &n, &m)){
 90     int num = getNum(n);
 91     while(m--){
 92       scanf("%I64d%s", &p, s);
 93       int ssp=1;
 94       int rp = dfs(1, n, p, ss, ssp, 1);
 95       init(s, rp, num);
 96 
 97       printf("%I64d\n", solve(s, ss, ssp, p, rp, num));
 98     }
 99   }
100   return 0;
101 }
792D AC代碼
相關文章
相關標籤/搜索