算法竞赛入门经典第三章习题总结(记录向)
2017-03-21 16:29
501 查看
总结一下刘老师的第三者习题。
用vj拉题,在原来做的情况上修改成规定输入输出格式,提交上去直到ac为止。
此题关键是记录X是否出现,X一旦出现则O会重新赋值为1。
主要是字符串的操作,将C,H,O,N出现的次数进行统计,最后得出总的分子量
关键是怎样把把一个数进行分解。
暴力,小技巧就是如果一个串是周期串,那么这个串的最小周期必然是串长度的约数。
把网格模拟成二维数组,先找到空格的位置,然后依据指令进行数组的操作
求每一列出现次数最多的字母。
对于计算循环小数的时候用数组记录每一步得出的结果,其中a=a%b*10是最关键的一个式子。
依次扫描s2中字符,如果与s1首字符相同则s2继续往后扫描并计数扫描成功的次数。当次数等于s1串的长度,则说明是子序列。
主要把长方体6个面的性质弄明白了就可以了。
此题关键在于字符串位置的移动,还有就是两个长条的上下位置需要互换,最后取其小值。
这题当时题意并没有看懂,后来查了相关资料,对于浮点数的存储有了一个了解浮点数的指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数,n为十进制整数)最好采用了这题大家都喜欢的打表的方法,lgM+Elg2=lgA+B。
这写题目我写了有好几个晚上,有时候实在没有思路的时候就去看别人的博客,吸取别人的思路,我觉得收获还是很多的。
用vj拉题,在原来做的情况上修改成规定输入输出格式,提交上去直到ac为止。
- 3-1得分score uva1585
#include<cstdio> #include<cstring> using namespace std; int main() { int T; scanf("%d",&T); while(T--) { char s[85]; scanf("%s",s); int sum = 0; int t=0; for(int i=0; i<strlen(s); i++) { if(s[i]=='X') { sum +=0; t = 0; } else{ t++; sum += t; } } printf("%d\n",sum); } return 0; }
此题关键是记录X是否出现,X一旦出现则O会重新赋值为1。
- 3-2分子量MolarMass uva1586
#include<cstdio> #include<cstring> #include<cctype> #include<cmath> using namespace std; char s[100]; char m[4] = {'C','H', 'O', 'N'}; int search(char c) { for(int i=0; i<4; i++) { if(c == m[i]) { return i; } } } int main() { int T; scanf("%d",&T); while(T--) { double sum = 0; scanf("%s",s); int num[4] = {0}; for(int i=0; i<strlen(s); i++) { if(isalpha(s[i])) { int t = 0; if(isdigit(s[i+1])) { if(isdigit(s[i+2])) t = (s[i+1]-'0')*10 + (s[i+2]-'0'); else t = s[i+1] - '0'; num[search(s[i])]+=t; } else num[search(s[i])]++; } } sum +=num[0]*12.01 + num[1]*1.008 + num[2]*16.00 + num[3]*14.01; printf("%.3f\n", sum); } return 0; }
主要是字符串的操作,将C,H,O,N出现的次数进行统计,最后得出总的分子量
- 3-3数数字DigitCounting uva1225
#include<stdio.h> #include<string.h> int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); int num[10]={0}; for(int i=1;i<=n;i++) { int k=i; while(k>0) { num[k%10]++; k/=10; } } for(int i=0;i<9;i++) { printf("%d ",num[i]); } printf("%d\n",num[9]); } return 0; }
关键是怎样把把一个数进行分解。
- 3-4周期串PeriodicStrings
#include<cstdio> #include<cstring> using namespace std; char s[100]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",s); int len = strlen(s); for(int i=1; i<=len; i++) { if(len%i) continue; int ok = 1; for(int j=0; j<i; j++) { for(int k=1; k<(len/i); k++) { if(s[j]!=s[j+k*i]) { ok = 0; break; } } if(ok==0) break; } if(ok) { printf("%d\n",i); break; } } if(T) printf("\n"); } return 0; }
暴力,小技巧就是如果一个串是周期串,那么这个串的最小周期必然是串长度的约数。
- 3-5谜题UVA227
#include<stdio.h> #include<ctype.h> int c,d;//修改为全局变量,来保存空格位置 void search_index(char a[5][5]) { int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(a[i][j]=='*') { c=i;d=j; break; } } } } int main() { char a[5][5]; for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%c",&a[i][j]); // int c,d;//分别保存空格的行数和列数 search_index(a); // printf("%d %d",c,d); int mad; char p; while((p=getchar())!=EOF) { if(p=='0') break; mad=0; switch(p) { case 'A': if(isalpha(a[c-1][d])==0) mad=1; else { a[c][d]=a[c-1][d]; a[--c][d]='*'; } break; case 'B': if(isalpha(a[c+1][d])==0) mad=1; else { a[c][d]=a[c+1][d]; a[++c][d]='*'; } break; case 'L': if(isalpha(a[c][d-1])==0) mad=1; else { a[c][d]=a[c][d-1]; a[c][--d]='*'; } break; case 'R': if(isalpha(a[c][d+1])==0) mad=1; else { a[c][d]=a[c][d+1]; a[c][++d]='*'; } break; } } if(mad == 1) printf("This puzzle has no final configuartion."); else { for(int i=0;i<5;i++) { for(int j=0;j<5;j++) printf("%c ",a[i][j]); printf("\n"); } } return 0; }
把网格模拟成二维数组,先找到空格的位置,然后依据指令进行数组的操作
- 3-7DNA序列 uva1368
#include<stdio.h> #include<stdlib.h> #include<string.h> const char *DNA="ACGT"; char Dna_Cs[50+5][1000+5]; int main() { // freopen("input.txt", "r", stdin); int T; scanf("%d",&T); while(T--) { int m,n; scanf("%d%d\n",&m,&n); int sum[4]={0}; int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%c",&Dna_Cs[i][j]); } getchar(); } int cnt = 0; for(int i=0;i<n;i++) { for(int g=0;g<4;g++) { sum[g]=0; } for(int j=0;j<m;j++) { for(int k=0;k<4;k++) { if(Dna_Cs[j][i]==DNA[k]) { sum[k]++; } } } int max=sum[0]; int p=0; for(int q=1;q<4;q++) { if(sum[q]>max) { max=sum[q]; p=q; } } // printf("p=%d\n",p); printf("%c",DNA[p]); fo 10b55 r(int j=0; j<m; j++) { if(DNA[p] != Dna_Cs[j][i]) cnt++; } } printf("\n"); printf("%d\n",cnt); } return 0; }
求每一列出现次数最多的字母。
- 3-8循环小数RepeatingDecimals
#include<cstdio> #include<cstring> using namespace std; const int maxn = 3000+5; int r[maxn],u[maxn],s[maxn]; int a,b; int main() { int t; while(scanf("%d%d",&a,&b)!=EOF) { t = a; memset(r,0,sizeof(r)); memset(u,0,sizeof(u)); int index = 0; r[index++] = a / b; a = a%b; while(!u[a] && a) { u[a] = index; s[index] = a; r[index] = 10*a/b; a=10*a%b; // printf("%d %d %d %d\n", u[a], s[index], r[index], a); index++; } printf("%d\n",a); printf("%d/%d = %d",t,b,r[0]); printf("."); for(int i=1; i<index && i<=50; i++) { if(a && s[i] == a) printf("("); printf("%d", r[i]); } if (!a) printf("(0"); if (index > 50) printf("..."); printf(")\n"); printf(" %d = number of digits in repeating cycle\n\n",!a ? 1 : index-u[a]); } return 0; }
对于计算循环小数的时候用数组记录每一步得出的结果,其中a=a%b*10是最关键的一个式子。
- 3-9子序列AllinAll
#include<cstdio> #include<cstring> using namespace std; const int maxn = 100000+10; char s1[maxn], s2[maxn]; int main() { // freopen("input.txt", "r", stdin); while(~scanf("%s%s", s1, s2)) { int j = 0, ok = 0; for(int i=0; i<strlen(s2); i++) { if(s2[i] == s1[j]) { j++; } if(j == strlen(s1)) { ok = 1; break; } } if(ok) printf("Yes\n"); else printf("No\n"); } }
依次扫描s2中字符,如果与s1首字符相同则s2继续往后扫描并计数扫描成功的次数。当次数等于s1串的长度,则说明是子序列。
- 3-10盒子Box
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struct box{ int l,w; }b[6];//定义矩形面结构体 bool cmp(box a,box b) { return a.w < b.w || (a.w == b.w && a.l < b.l); } int main(void) { while(scanf("%d%d",&b[0].w,&b[0].l)!=EOF) { if(b[0].w>b[0].l) swap(b[0].w,b[0].l); for(int i=1;i<6;++i) { scanf("%d%d",&b[i].w,&b[i].l); if(b[i].w>b[i].l) swap(b[i].w,b[i].l); } sort(b,b+6,cmp);//排序 // for(int i=0;i<6;i++) // printf("%d %d\n",b[i].l,b[i].w);//可以先打一下排序后矩形的长和宽,这样判断是否可以构成长方体会方便一些 int flag = 1; for(int i=0;i<6;i+=2) { if(b[i].w!=b[i+1].w||b[i].l!=b[i+1].l) flag = 0; //判断长方体3对面是否相等 } if(b[0].w != b[2].w || b[0].l != b[4].w || b[2].l != b[4].l) flag = 0;//判断三个面是否能相接 printf("%s",flag?"possible":"impossible"); } return 0; }
主要把长方体6个面的性质弄明白了就可以了。
- 3-11换低档装置Kickdown
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 100+5; char s1[maxn],s2[maxn]; int test(int k,char *s1,char *s2)//s2作为底部长条,s1作为上部长条 { for(int i=0;s1[k+i]&&s2[i];i++) if(s1[k+i]+s2[i]-2*'0'>3) return 0;//如果两个长条某一相对高度加起来大于3则不符合 return 1; } int fun(char *s1,char *s2) { int k = 0; while(!test(k,s1,s2)) //如果不符合,则字符串位置向后移 k++; return max(strlen(s1),strlen(s2)+k); } int main(void) { while(scanf("%s%s",s1,s2)!=EOF) { // printf("%d %d",fun(s1,s2),fun(s2,s1)); printf("%d\n",min(fun(s1,s2),fun(s2,s1)));//s1与s2位置颠倒一下取其中最短长度 } return 0; }
此题关键在于字符串位置的移动,还有就是两个长条的上下位置需要互换,最后取其小值。
- 3-12浮点数Floating-PointNumbers
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; typedef long long LL; double M[10][31]; LL E[10][31]; char s[30]; double m,x; int e; int main(void) { for(int i=0;i<=9;i++) { for(int j=1;j<=30;j++) { m = 1-pow(2,-i-1); e = pow(2,j)-1; x = log10(m)+e*log10(2); E[i][j] = floor(x), M[i][j] = pow(10, x - floor(x)); } } double A; int B; while(cin>>s) { if(s=="0e0") break; s[17]='/'; sscanf(s,"%lf/%d",&A,&B); for(int i=0;i<=9;i++) { for(int j=1;j<=30;j++) { if(B==E[i][j]&&fabs(M[i][j]-A)<1e-4) { printf("%d %d\n",i,j); } } } } return 0; }
这题当时题意并没有看懂,后来查了相关资料,对于浮点数的存储有了一个了解浮点数的指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数,n为十进制整数)最好采用了这题大家都喜欢的打表的方法,lgM+Elg2=lgA+B。
这写题目我写了有好几个晚上,有时候实在没有思路的时候就去看别人的博客,吸取别人的思路,我觉得收获还是很多的。
相关文章推荐
- 算法竞赛入门经典第三章总结(2):后半部分习题解答
- 《算法竞赛入门经典》第三章习题 (2)
- 《算法竞赛入门经典》第三章习题3-1
- 算法竞赛入门经典第二版第三章习题
- [个人记录]小白书学习1.5习题(算法竞赛入门经典第一版)
- 算法竞赛入门经典(第2版)第三章习题(Java)
- SEO日常总结 SEO优化 SEO学习 明天接着读第三章 先把前两章的摘抄做个记录 没事的时候看看
- [个人记录]小白书学习习题3-5~3-7(算法竞赛入门经典第一版)
- 《算法竞赛入门经典(第二版)》第三章 习题(1-5)
- 《算法竞赛入门经典(第二版)》第三章习题(1-4)
- 《算法竞赛入门经典》第三章习题3-3
- 《算法竞赛入门经典》第三章习题3-8
- 《算法竞赛入门经典》第三章习题3-7
- 《算法竞赛入门经典(第二版)》第三章 习题(6-9)
- 《算法竞赛入门经典》第2章习题总结
- 《算法竞赛入门经典》第三章习题3-2
- 《算法竞赛入门经典》第三章习题3-6
- 算法竞赛入门经典第三章习题解答
- 算法竞赛入门经典 第三章习题题解(二)
- 《算法竞赛入门经典(第二版)》第三章习题(5-6)