PTA
1.7-1 时间:15分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<queue> 9 using namespace std; 10 int main(){ 11 int n,i; 12 char s; 13 scanf("%d %c",&n,&s); 14 int flag=0; 15 for(i=0;i<n;i++){ 16 if(2*i*i-1<=n&&2*(i+1)*(i+1)-1>n){ 17 flag=n-(2*i*i-1); 18 break; 19 } 20 } 21 char a[100][100]; 22 int m=2*i-1,mm=3; 23 for(int j=1;j<=2*i-1;j++){ 24 25 if(j<=i){ 26 for(int ss=0;ss<(2*i-1-m)/2;ss++){ 27 printf(" "); 28 } 29 for(int ss=0;ss<m;ss++){ 30 printf("%c",s); 31 } 32 printf("\n"); 33 }else{ 34 for(int ii=0;ii<(2*i-1-mm)/2;ii++){ 35 printf(" "); 36 } 37 for(int ii=0;ii<mm;ii++){ 38 printf("%c",s); 39 } 40 printf("\n"); 41 mm+=2; 42 } 43 44 m-=2; 45 } 46 printf("%d",flag); 47 }
感受:先看到题的时候就想肯定会,但是真正操作的时候脑子中就很乱,一开始想用字符串数组,又想用直接输出,觉得字符串数组可能写起来也不好写,和直接输出没什么两样,然后就写,发现思路真的应该先想到可以用什么,然后朝着一个方向走,不然写着写着自己就很乱套,导致用时也长,代码还容易出问题
2.7-2 时间:7分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<queue> 9 using namespace std; 10 int main(){ 11 char s[100]; 12 scanf("%s",&s); 13 int sum=0; 14 int n=strlen(s); 15 for(int i=0;i<n;i++){ 16 if(s[i]=='2'){ 17 sum++; 18 } 19 } 20 double t=sum*1.0/n; 21 22 if(s[0]=='-'){ 23 t=(sum)*1.0/(n-1); 24 t*=1.5; 25 } 26 27 if((s[n-1]-'0')%2==0){ 28 t*=2; 29 } 30 char ss='%'; 31 printf("%.2f",t*100); 32 printf("%c",ss); 33 }
感受:刚拿到这个题第一反应这个应该不难,就是细节的问题,具体化一些注意一些细枝末节,写着写着代码就会发现问题:1.负号占位;2.先计算谁,怎么进行变化;3.输出百分号的问题,虽然简单,但也不能一次就考虑全面并且写好代码
3.7-3 时间:13分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<queue> 9 using namespace std; 10 int main(){ 11 int jj,yj; 12 scanf("%d %d",&jj,&yj); 13 int n; 14 scanf("%d",&n); 15 int suma=0,sumb=0; 16 int flag=-1; 17 while(n--){ 18 int a=0,b=0; 19 int jh,jhh,yh,yhh; 20 scanf("%d %d %d %d",&jh,&jhh,&yh,&yhh); 21 if(jhh==(jh+yh)){ 22 a++; 23 } 24 if(yhh==(jh+yh)){ 25 b++; 26 } 27 if(a>b){ 28 suma++; 29 } 30 if(b>a){ 31 sumb++; 32 } 33 if(suma>jj){ 34 printf("A\n"); 35 printf("%d\n",sumb); 36 break; 37 } 38 if(sumb>yj){ 39 printf("B\n"); 40 printf("%d\n",suma); 41 break; 42 } 43 } 44 45 }
感受:题目本身不是很难,也没有太细节的东西,就是需要注意一下,如果有了结果,下面的数据就不用再读,自己测试的时候,要一个个的把样例敲进去才会有结果,如果变量不是很清楚的话,就要用注释标记一下,一定先想好具体怎么做,方向在哪再动手,不然很容易混淆变量,而且也写不好代码
4.7-14 时间:13分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 char s[20]; 10 scanf("%s",&s); 11 int n=strlen(s); 12 int in[20]; 13 int index[20]={0},arr[20]; 14 for(int i=0;i<n;i++){ 15 index[s[i]-'0']++; 16 } 17 int j=0; 18 for(int i=0;i<10;i++){ 19 if(index[i]>0){ 20 in[j]=i; 21 j++; 22 } 23 } 24 sort(in,in+j); 25 for(int i=0;i<n;i++){ 26 for(int jj=0;jj<j;jj++){ 27 if(s[i]-'0'==in[jj]){ 28 arr[i]=j-1-jj; 29 } 30 } 31 } 32 printf("int[] arr = new int[]{"); 33 for(int i=j-1;i>=0;i--){ 34 printf("%d",in[i]); 35 if(i>0){ 36 printf(","); 37 } 38 } 39 printf("};\n"); 40 printf("int[] index = new int[]{"); 41 for(int i=0;i<n;i++){ 42 printf("%d",arr[i]); 43 if(i<n-1){ 44 printf(","); 45 } 46 } 47 printf("};"); 48 49 }
感受:这题相对来说也不是很难,就是很绕,需要去重,然后存入不重复的数字,再导入下标,这次代码基本一气呵成,写代码过程中一定要清醒,明白自己的各个数组和变量是干嘛的,才能减少代码的错误率,实在不行进行注释标注
5.7-24 时间:10分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 string a,b; 10 getline(cin,a); 11 getline(cin,b); 12 int n1=a.size(); 13 int n2=b.size(); 14 for(int i=0;i<n1;i++){ 15 int flag=0; 16 for(int j=0;j<n2;j++){ 17 if(a[i]==b[j]){ 18 flag=1; 19 continue; 20 } 21 } 22 if(flag==0){ 23 printf("%c",a[i]); 24 } 25 } 26 27 }
感受:这个题一开始觉得可能两个循环会超时,后来看到题目范围不是很大,就用了两个for循环,整体也不难,连处理时的细节也没有什么,就是需要注意一下gets(),get()两种方式读取不能用,需要声明string类型,用getline(cin,a),进行读取
6.7-25 时间:5分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 int a; 10 char s; 11 scanf("%d %c",&a,&s); 12 int b; 13 for(int i=0;i<a*0.5;i++){ 14 for(int j=0;j<a;j++){ 15 printf("%c",s); 16 } 17 printf("\n"); 18 } 19 20 }
感受:并不难,就是注意精确度应该用*0.5不要/2
7.7-5 时间:9分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 char a[maxx]; 10 scanf("%s",&a); 11 int n=strlen(a); 12 int s[4]={0}; 13 for(int i=0;i<n;i++){ 14 if(a[i]=='G'||a[i]=='g'){ 15 s[0]++; 16 }else if(a[i]=='p'||a[i]=='P'){ 17 s[1]++; 18 }else if(a[i]=='L'||a[i]=='l'){ 19 s[2]++; 20 }else if(a[i]=='T'||a[i]=='t'){ 21 s[3]++; 22 } 23 } 24 while(!(s[0]==0&&s[1]==0&&s[2]==0&&s[3]==0)){ 25 if(s[0]>0){ 26 printf("G"); 27 s[0]--; 28 } 29 if(s[1]>0){ 30 printf("P"); 31 s[1]--; 32 } 33 if(s[2]>0){ 34 printf("L"); 35 s[2]--; 36 } 37 if(s[3]>0){ 38 printf("T"); 39 s[3]--; 40 } 41 } 42 43 }
感受:题目也不是很难,就是注意一下大小写都要进行统计,用数组存的话,因为输出的时候有顺序,并且不是很多的数字,可以用循环也可以直接列出进行变化就可以
8.7-16 时间:12分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 int n; 10 char p; 11 string s; 12 scanf("%d %c",&n,&p); 13 getchar(); 14 getline(cin,s); 15 int len=s.size(); 16 for(int i=0;i<n-len;i++){ 17 printf("%c",p); 18 } 19 if(n<=len){ 20 for(int i=len-n;i<len;i++){ 21 printf("%c",s[i]); 22 } 23 }else{ 24 cout<<s; 25 } 26 27 28 }
感受:题目还好,就是样例二是怎么来的在题目中没有说,这时候就得大胆的猜一下,然后再进行输出,有时候多想想长度的问题和关系,直接输出就好,就不用再进行数组的创建了,多想想少算算,节省了时间和代码错误率
9.7-35 时间:五分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 int n; 10 scanf("%d",&n); 11 int a[1500]={0}; 12 while(n--){ 13 int k; 14 scanf("%d",&k); 15 for(int i=0;i<k;i++){ 16 int m; 17 scanf("%d",&m); 18 a[m]++; 19 } 20 } 21 int maxx=0,maxxi=0;; 22 for(int i=1;i<=1000;i++){ 23 if(a[i]>=maxx){ 24 maxx=a[i]; 25 maxxi=i; 26 } 27 } 28 printf("%d %d",maxxi,maxx); 29 30 31 }
感受:刚开始看的时候,觉得会不会有坑,看了一下,没发现坑,然后就想先写着代码,到后面提交以后再改也行,就一气呵成,整体来说这个题并不难,还是希望能再提高一些速度,为后面的难题留出时间,还有那些代码冗长的题留出时间
10-7-78 时间:12分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 int main(){ 9 int n; 10 scanf("%d",&n); 11 getchar(); 12 while(n--){ 13 14 string a; 15 getline(cin,a); 16 int len=a.size(); 17 int va=0,flag=0; 18 int sum=0; 19 int b=0; 20 for(int i=0;i<len-3;i++){ 21 if(a[i]=='o'&&a[i+1]=='n'&&a[i+2]=='g'&&a[i+3]=='.'){ 22 flag=1; 23 sum++; 24 25 for(int j=i;j>=0;j--){ 26 if(a[j]==' '){ 27 b++; 28 } 29 if(b==3){ 30 va=j; 31 break; 32 } 33 } 34 35 } 36 if(a[i]=='o'&&a[i+1]=='n'&&a[i+2]=='g'&&a[i+3]==','){ 37 sum++; 38 } 39 } 40 if(flag==0||sum!=2){ 41 printf("Skipped\n"); 42 }else{ 43 for(int i=0;i<=va;i++){ 44 printf("%c",a[i]); 45 } 46 printf("qiao ben zhong.\n"); 47 } 48 } 49 }
感受:这个题一开始读的时候没有读仔细,以为是在'ong'的地方改成‘敲笨钟’,就直接全部答案错误,后来发现是这的问题,读题一定得注意细节挖掘一些可以wa掉的点
11.7-6 时间:24分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxx=1e5+2; 8 struct people{ 9 int num=0; 10 int sum=0; 11 int money; 12 }a[maxx]; 13 bool cmp(people a,people b){ 14 if(a.money>b.money){ 15 return 1; 16 }else if(a.money<b.money){ 17 return 0; 18 }else{ 19 if(a.sum>b.sum){ 20 return 1; 21 }else if(a.sum<b.sum){ 22 return 0; 23 }else{ 24 return a.num<b.num; 25 } 26 } 27 } 28 int main(){ 29 int n; 30 int k; 31 32 scanf("%d",&n); 33 int nn=n; 34 int j=1; 35 while(n--){ 36 int k; 37 scanf("%d",&k); 38 int sum=0; 39 for(int i=0;i<k;i++){ 40 int num; 41 int va; 42 scanf("%d %d",&num,&va); 43 a[num].money+=va; 44 a[num].num=num; 45 sum+=va; 46 a[num].sum++; 47 48 } 49 a[nn-n].money-=sum; 50 } 51 for(int i=1;i<nn+1;i++){ 52 if(a[i].num==0){ 53 a[i].num=i; 54 } 55 } 56 sort(a+1,a+nn+1,cmp); 57 for(int i=1;i<nn+1;i++){ 58 double money; 59 money=a[i].money*0.01; 60 printf("%d %.2f",a[i].num,money); 61 if(i<nn){ 62 printf("\n"); 63 } 64 } 65 }
感受:当时比赛的时候这个题做出来了,然后导致这次读题不仔细,从一开始想用数组就出现了逻辑错误,这个道路根本就是不对的,当时还在想为什么没有细节,后来边写边看题目,就发现并不是这样的,又改成了结构体数组,再wa初始化的问题,然后排序中不要加上数组下标为0的点,最后就是排序的条件判断也读错了题目,导致wa了好几回,总之就是读题出现了问题,才有了后面的这种种问题
12.7-19 时间:10分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 const int maxx=1e5+2; 9 10 int main(){ 11 int n,k,m; 12 scanf("%d %d %d",&n,&k,&m); 13 int nn=n; 14 double a[maxx]={0}; 15 while(nn--){ 16 double sum=0; 17 double minn=1e5,ma=0; 18 for(int i=0;i<k;i++){ 19 double num=0; 20 scanf("%lf",&num); 21 sum+=num; 22 minn=min(minn,num); 23 ma=max(ma,num); 24 } 25 sum-=minn; 26 sum-=ma; 27 a[n-nn-1]=sum*1.0/(k-2); 28 } 29 sort(a,a+n); 30 for(int i=n-m;i<n;i++){ 31 printf("%.3f",a[i]); 32 if(i<n-1){ 33 printf(" "); 34 } 35 } 36 37 }
感受:这个题看起来可能有很多细节之处,但是都是那种很常见的细节问题,读题仔细一些,然后写代码之前想好了是用数组还是结构体,看了看范围发现数组就够用,相比较来说,自身还是对数组操作熟悉一些,就选择了数组进行计算,然后这次细节也不是很多,就一气呵成
13.7-27 时间:40分钟
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #include<set> 8 using namespace std; 9 const int maxx=1e9+2; 10 int main(){ 11 int n; 12 scanf("%d",&n); 13 set<int> s[100]; 14 for(int i=0;i<n;i++){ 15 int k; 16 scanf("%d",&k); 17 int t; 18 for(int j=0;j<k;j++){ 19 scanf("%d",&t); 20 s[i].insert(t); 21 } 22 } 23 int m; 24 scanf("%d",&m); 25 for(int i=0;i<m;i++){ 26 int a,b; 27 scanf("%d %d",&a,&b); 28 int sum=0; 29 for(set<int>::iterator it=s[a-1].begin();it!=s[a-1].end();it++){ 30 if(s[b-1].count(*it)){ 31 sum++; 32 } 33 } 34 int summ=s[a-1].size()+s[b-1].size()-sum; 35 printf("%.2f%%\n",sum*100.0/summ); 36 } 37 }
感受:本来想用结构体试试,看到数组范围想到肯定会有超时的,然后想着先试试,万一能过,然后用结构体只过了两个点,然后用数组也会超时,后来看了看题解发现,用set不仅不会超,代码繁琐程度也小,后来选择用了set,一个是set数组,一个是迭代器和set函数count的使用是从这个题中学到的东西
14.7-30 时间:20分钟
代码:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 int main(){ 8 string s; 9 getline(cin,s); 10 int n=s.size(); 11 int sum=0; 12 for(int i=0;i<n;i++){ 13 int left=i-1; 14 int right=i+1; 15 int ss=0; 16 while(left>=0&&right<n&&s[left]==s[right]){ 17 ss+=2; 18 left--; 19 right++; 20 } 21 sum=max(sum,ss+1); 22 } 23 for(int i=0;i<n;i++){ 24 int left=i-1; 25 int right=i; 26 int ss=0; 27 while(left>=0&&right<n&&s[left]==s[right]){ 28 ss+=2; 29 left--; 30 right++; 31 } 32 sum=max(sum,ss); 33 } 34 printf("%d\n",sum); 35 36 }
感受:看到这个题的时候想用回文字符串的方法,进行比较,后来发现那样变化的太多了,也没办法定一动一,后来用中心定住再去循环比较,但是这样要分两种情况,以后一定注意两种端点都变化的情况下找找有没有好的想法能够定一动一,知道的定点而且是有规律的
15.7-7排座位 时间:30分钟
代码:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdio> 6 using namespace std; 7 int main(){ 8 int n,m,k; 9 scanf("%d %d %d",&n,&m,&k); 10 int a[n+2][n+2]={0}; 11 for(int i=0;i<m;i++){ 12 int h,l,num; 13 scanf("%d %d %d",&h,&l,&num); 14 a[h][l]=num; 15 a[l][h]=num; 16 } 17 while(k--){ 18 int num1,num2; 19 scanf("%d %d",&num1,&num2); 20 if(a[num1][num2]==1){ 21 printf("No problem\n"); 22 }else if(a[num1][num2]==0){ 23 printf("OK\n"); 24 }else{ 25 int flag=0; 26 for(int i=0;i<n;i++){ 27 if(a[num1][i]*a[num2][i]==1){//一定注意 28 flag=1; 29 } 30 } 31 if(a[num1][num2]==0&&flag==1){ 32 printf("No problem\n"); 33 }else if(a[num1][num2]==0&&flag==0){ 34 printf("OK\n"); 35 }else if(a[num1][num2]==-1&&flag==1){ 36 printf("OK but...\n"); 37 }else{ 38 printf("No way\n"); 39 } 40 } 41 } 42 }
感受:输入的i号宾客和j号宾客对应某种关系,就用一个数组的第i行第j列存入其对应关系,第j行第i列存入其对应关系,当查找其关系时进行数组遍历寻找,找其所在行所在列是否存在1或者-1,进行查找其关系,一定注意判断条件应该是相乘为1,并不是两个都为1