出了4题,rank 37
A ,水题,看字符串里有多少个TTT, TTH, THT, THH, HTT, HTH, HHT and HHH
1A
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int main() { int ncases,ind,i,k,p; int d[8] = {111,112,121,122,211,212,221,222}; int a[50]; char str[50]; int sum[8]; scanf("%d",&ncases); while( ncases-- ) { memset(sum,0,sizeof(sum)); scanf("%d",&ind); scanf("%s",str); int len = strlen(str); for(i=0; i<len; i++) if( str[i] == 'T' ) a[i] = 1; else a[i] = 2; for(i=0; i<len-2; i++) { int p = a[i]*100 + a[i+1]*10 + a[i+2]; for(k=0; k<8; k++) if( p == d[k] ) { sum[k]++; break; } } printf("%d",ind); for(i=0; i<8; i++) printf(" %d",sum[i]); printf("/n"); } return 0; }
B,大数,两个数的二进制表示相同位加和对进制取余再转化十进制即可,有好几个小错误让我纠结半天。1A。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int a[100]; int b[100]; int c[100]; int Base(int base,int n,int a[]) { int x = 0; while( n != 0 ) { a[x++] = n % base; n /= base; } return x; } int out(int base,int c[],int len) { int n = 0,i; int x = 1; for(i=0; i<len; i++) { n += c[i] * x; x *= base; } return n; } int main() { int ncases,len; int n,ind,i,baa,x,y; int lena,lenb; scanf("%d",&ncases); while( ncases-- ) { memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d%d%d%d",&ind,&baa,&x,&y); lena = Base(baa,x,a); lenb = Base(baa,y,b); len = max(lena,lenb); for(i=0; i<len; i++) c[i] = (a[i] + b[i])%baa; n = out(baa,c,len); printf("%d %d/n",ind,n); } return 0; }
D,纠结题。和CW讨论了半天才确定它的题意。。又PE了几次。。。无语死了都。
两个字符表示需要重复的状况,后俩字符是需要重复的。前俩字符,换成2进制,每个换成4个bit,如果8个bit的首位是1,那么取后七位加3得x,那么下面两个字符重复x次。
如果首位是0,那么取后七位加1得x,下面x组码不用重复,直接输出来。
PE了,输入数据中可能换行了 = =。。所以用cin。。。输出的话,80个字符换下行才行。。。无语死。。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int sum; char out[100000]; void repeat(int n,char a,char b) { while( n-- ) { out[sum++] = a; out[sum++] = b; } } int flag; int H( char a,char b) { int x, y; if( isdigit(a) ) x = a -'0'; else x = a - 'A' + 10; if( isdigit(b) ) y = b - '0'; else y = b -'A' + 10; if( x >= 8 ) { flag = 1; return (x-8)*16+y; } else return x*16+y; } char str[100000]; int main() { int ncases,num,i,ind,k,x; scanf("%d",&ncases); int n; while( ncases-- ) { sum = 0; scanf("%d%d",&ind,&num); for(i=0; i<num*2; i++) cin >> str[i]; for(i=0; i<num*2; i+=2) { flag = 0; x = H(str[i],str[i+1]); if( flag ) { repeat(x+3,str[i+2],str[i+3]); i += 2; } else { for(k=i+2; k<=i+1+(x+1)*2; k++) { if( k == num*2 ) break; out[sum++] = str[k]; } i += (x+1)*2; } } printf("%d %d/n",ind,sum/2); for(i=0; i<sum; i++) { if( i % 80 == 0 && i != 0 ) printf("/n"); printf("%c",out[i]); } printf("/n"); } return 0; }
E,简单DP,简单递推下就OK了,我推了半天呢。。。不过还是蛮有成就感的。1A。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; long long a[100][100]; void init() { int i,k; for(i=0; i<=9; i++) a[0][i] = 1ll; for(i=1; i<=64; i++) { a[i][0] = a[i-1][0]; for(k=1; k<=9; k++) a[i][k] = a[i][k-1]+a[i-1][k]; } } int main() { int ncases; int ind,n,i; memset(a,0,sizeof(a)); init(); long long sum ; for(i=0; i<=9; i++) sum += a[3][i]; scanf("%d",&ncases); while( ncases-- ) { scanf("%d%d",&ind,&n); sum = 0ll; for(i=0; i<=9; i++) sum += a[n-1][i]; printf("%d %lld/n",ind,sum); } return 0; }