2020天梯赛补题
L1-2
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdio> 6 #include<map> 7 using namespace std; 8 const int maxx=1e5+1;//7.39 9 int main(){ 10 int a,b,c; 11 scanf("%d %d %d",&a,&b,&c); 12 printf("%d",a*b*c); 13 }
L1-3
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdio> 6 #include<map> 7 using namespace std; 8 const int maxx=1e5+1;//7.39 9 int main(){ 10 double a,b,c; 11 scanf("%lf %lf %lf",&a,&b,&c); 12 if(b==0){ 13 a*=2.455; 14 }else{ 15 a*=1.26; 16 } 17 if(a<c){ 18 printf("%.2f ^_^\n",a); 19 }else{ 20 printf("%.2f T_T\n",a); 21 } 22 }
想法:一开始的时候以为这个题信息量太大了,后来发现只是读有数字的一段就行,然后其实就是让你根据公式计算出一个数,然后再和另外一个数比较一下
L1-4 调和平均
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdio> 6 #include<map> 7 using namespace std; 8 const int maxx=1e5+1;//7.39 9 int main(){ 10 double th=0; 11 double a; 12 int n; 13 //scanf("%d",&n); 14 cin>>n; 15 double sum=0; 16 for(int i=0;i<n;i++){ 17 cin>>a; 18 double s=a; 19 sum+=1/s; 20 } 21 printf("%.2f\n",1/(sum/n)); 22 }
想法:这个题是wa掉的第一个题,就是本来double直接定义一个变量就可以,我定义成了变量数组,不知道为什么就会wa掉一分,即使到现在也没整清楚
L1-5 胎压监测
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdio> 6 #include<map> 7 using namespace std; 8 const int maxx=1e5+1;//7.39 9 int main(){ 10 int a[5]={0}; 11 int maxx=0; 12 for(int i=1;i<5;i++){ 13 scanf("%d",&a[i]); 14 maxx=max(maxx,a[i]); 15 } 16 int flag1=0,flag2=0,sum=0,diff=0,last=0; 17 scanf("%d %d",&last,&diff); 18 int flagi=0,sumi=0; 19 int s=0; 20 for(int i=1;i<5;i++){ 21 int f=0; 22 if(a[i]<last){ 23 flag1++; 24 f=1; 25 } 26 if(maxx-a[i]>diff){ 27 flag2++; 28 f++; 29 } 30 if(flag1==1&&s==0){ 31 flagi=i; 32 s=1; 33 } 34 if(flag2==1&&s==0){ 35 flagi=i; 36 s=1; 37 } 38 if(f==2){ 39 sum++; 40 } 41 } 42 if(flag1==0&&flag2==0){ 43 printf("Normal"); 44 }else if(flag1==1&&flag2==0){ 45 printf("Warning: please check #%d!",flagi); 46 }else if(flag1==0&&flag2==1){ 47 printf("Warning: please check #%d!",flagi); 48 }else if(sum==1&&flag1==1&&flag2==1){ 49 printf("Warning: please check #%d!",flagi); 50 }else{ 51 printf("Warning: please check all the tires!"); 52 } 53 54 }
想法:只是检测的时候判断条件有一些繁琐,只要记得哪里对哪里就行,容易wa掉的还有就是如果只有一个既是最大误差超了又是低于设定的值,那就得记录一下
L1-6 吃火锅
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<stack> 7 using namespace std; 8 int main(){ 9 string s; 10 int sum=1,first=0,t=0; 11 while(1){ 12 getline(cin,s); 13 int n=s.size(); 14 if(n==1&&s[0]=='.'){ 15 break; 16 } 17 if(s.find("chi1 huo3 guo1")!=-1){ 18 t++; 19 if(first==0){ 20 first=sum; 21 } 22 } 23 sum++; 24 } 25 printf("%d\n",sum-1); 26 if(t==0){ 27 printf("-_-#\n"); 28 }else{ 29 printf("%d %d",first,t); 30 } 31 }
想法:直接用find函数找“chi1 huo3 guo1”就行,然后该标记的进行标记,然后记录输出就好
L1-7
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdio> 6 #include<map> 7 using namespace std; 8 const int maxx=1e5+1;//7.39 9 int main(){ 10 int m,n; 11 // long long int sum=0; 12 scanf("%d %d",&m,&n); 13 while(n--){ 14 long long int sum=0; 15 char s[m]; 16 scanf("%s",&s); 17 for(int i=0;i<m;i++){ 18 if(s[i]=='n'){ 19 sum+=pow(2,m-1-i); 20 } 21 } 22 printf("%lld\n",sum+1); 23 } 24 25 }
想法:这就是一个二进制的问题,n就是1,y就是0,然后通过这种二进制转换出来以后,记得+1
L1-8
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<stack> 7 using namespace std; 8 int main(){ 9 int a[10]={0}; 10 int s[4][4]; 11 int ii=0,jj=0; 12 for(int i=1;i<=3;i++){ 13 for(int j=1;j<=3;j++){ 14 scanf("%d",&s[i][j]); 15 a[s[i][j]]=1; 16 if(s[i][j]==0){ 17 ii=i; 18 jj=j; 19 } 20 } 21 } 22 int flag=0; 23 for(int i=1;i<10;i++){ 24 if(a[i]==0){ 25 flag=i; 26 } 27 } 28 s[ii][jj]=flag; 29 for(int i=0;i<3;i++){ 30 int x,y; 31 scanf("%d %d",&x,&y); 32 //ss[x][y]=s[i][j]; 33 printf("%d\n",s[x][y]); 34 } 35 int n; 36 scanf("%d",&n); 37 int sum=0; 38 if(n<=3){ 39 for(int i=1;i<=3;i++){ 40 sum+=s[n][i]; 41 } 42 }else if(n<=6){ 43 for(int i=1;i<=3;i++){ 44 sum+=s[i][n-3]; 45 } 46 }else if(n==7){ 47 sum+=s[1][1]+s[2][2]+s[3][3]; 48 }else{ 49 sum+=s[1][3]+s[2][2]+s[3][1]; 50 } 51 if(sum==6){ 52 printf("10000\n"); 53 }else if(sum==7){ 54 printf("36"); 55 }else if(sum==8){ 56 printf("720"); 57 }else if(sum==9){ 58 printf("360"); 59 }else if(sum==10){ 60 printf("80"); 61 }else if(sum==11){ 62 printf("252"); 63 }else if(sum==12){ 64 printf("108"); 65 }else if(sum==13){ 66 printf("72"); 67 }else if(sum==14){ 68 printf("54"); 69 }else if(sum==15){ 70 printf("180"); 71 }else if(sum==16){ 72 printf("72"); 73 }else if(sum==17){ 74 printf("180"); 75 }else if(sum==18){ 76 printf("119"); 77 }else if(sum==19){ 78 printf("36"); 79 }else if(sum==20){ 80 printf("306"); 81 }else if(sum==21){ 82 printf("1080"); 83 }else if(sum==22){ 84 printf("144"); 85 }else if(sum==23){ 86 printf("1800"); 87 }else if(sum==24){ 88 printf("3600"); 89 } 90 91 }
想法:比赛的时候读题不仔细,以为是自己判断哪一行哪一列,其实没有这么复杂,题目中其实已经给了出来,当时比赛wa掉的部分应该也是我存sum和奖金的时候用了数组,数组存入时的对应关系应该是错了
L2-1 简单计算器
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<stack> 7 using namespace std; 8 int main(){ 9 int n; 10 stack<int> s1; 11 scanf("%d",&n); 12 for(int i=0;i<n;i++){ 13 int num; 14 cin>>num; 15 s1.push(num); 16 } 17 stack<char> s2; 18 getchar(); 19 for(int i=0;i<n-1;i++){ 20 char c; 21 cin>>c; 22 s2.push(c); 23 } 24 int sss=0; 25 int sum=0; 26 int n1,n2; 27 int flag=0; 28 while(!s1.empty()&&!s2.empty()){ 29 n1=s1.top(); 30 s1.pop(); 31 n2=s1.top(); 32 s1.pop(); 33 char op; 34 op=s2.top(); 35 s2.pop(); 36 if(op=='+'){ 37 sum=n2+n1; 38 }else if(op=='-'){ 39 sum=n2-n1; 40 }else if(op=='*'){ 41 sum=n2*n1; 42 }else if(op=='/'){ 43 if(n1==0){ 44 flag=1; 45 break; 46 } 47 sum=n2/n1; 48 } 49 50 s1.push(sum); 51 if(s1.size()==1){ 52 sss=sum; 53 } 54 } 55 if(flag==1){ 56 printf("ERROR: %d/0",n2); 57 }else{ 58 printf("%d",sss); 59 } 60 }
想法:按题目中存入的直接存就好了,但存取当s1只剩一个元素的时候记得进行先保存下来,等到最后进行输出,不然最后再输出就是0了
L2-3 完全二叉树的层序遍历
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std;//后序遍历:左右后 7 const int maxx=1e5; 8 pair<int,int> ss[maxx]; 9 int main(){ 10 int a[40]={0,16,17,8,18,19,9,4,20,21,10,22,23,11,5,2,24,25,12, 11 26,27,13,6,28,29,14,30,31,15,7,3,1}; 12 //sort(a+1,a+32); 13 int n; 14 scanf("%d",&n); 15 int flag=1; 16 for(int i=1;i<=n;i++){ 17 scanf("%d",&ss[i].second); 18 for(int j=flag;j<=31;j++){ 19 if(a[j]<=n){ 20 ss[i].first=a[j]; 21 flag=j+1; 22 break; 23 } 24 } 25 } 26 sort(ss+1,ss+n+1); 27 for(int i=1;i<=n;i++){ 28 printf("%d",ss[i].second); 29 if(i<n){ 30 printf(" "); 31 } 32 } 33 34 }
想法:当时看到二叉树就以为很难自己肯定过不了,结果场下一看,完全可以当成一个规律题,题目范围是31个点,就可以先把这31个点按照完全二叉树的顺序进行后序遍历,然后因为其相对位置是不变的所以读取之后只要找到这些数中按顺序,那些小于n的序号就是此时读入数的层序遍历序号,巧用pair再进行排序


浙公网安备 33010602011771号