先刷前四題,剩下的有空補。ide
題意:給出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 }
題意: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 }
題意:給一個數,問最少刪除多少位後能夠被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 }
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 }