2019YPACM社团年终赛暨实验室选拔赛题解
第一题 帅学长的爱心 第二题 秋姐妹鸣泣之时 秋日天空下 第三题 王韬韬学长之喝可乐
第四题 Thanos sort 灭霸の无限手套 第五题 云云姐的奇妙键盘 第六题 云云姐想要染色
第七题 云云姐梦游仙境之决战史莱姆 第八题 王韬韬学长之买绳子 第九题 Zxh学长的奇妙游戏
第一题 帅学长的爱心 (返回顶部)
题意:输出0或者1 ,0时输出0 ,1时输出指定的爱心
思路:给出了公式,按照公式输出就行
1 #include<stdio.h> 2 int main() 3 { 4 int n; 5 while(~scanf("%d",&n)){ 6 if(n==1){ 7 for(double i=1.5;i>=-1.5;i-=0.1){ 8 for(double j=-1.5;j<=1.5;j+=0.05){ 9 double k=j*j+i*i-1.0; 10 if(k*k*k<=j*j*i*i*i){ 11 printf("*"); 12 }else{ 13 printf(" "); 14 } 15 } 16 printf("\n"); 17 } 18 } 19 else{ 20 printf("0\n"); 21 } 22 } 23 return 0; 24 }
第二题 秋姐妹鸣泣之时 秋日天空下 (返回顶部)
题意:输入n,给n行01字符串,每个0和1都可以变成0或者1,如果能全部变成0,输出qiurangzi,不能就输出qiujingye
思路:总有一种情况会全变成0,所以直接输出qiurangzi即可
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n; 6 char s[1000]; 7 while(~scanf("%d",&n)){ 8 while(n--){ 9 scanf("%s",s); 10 printf("qiurangzi\n"); 11 } 12 } 13 return 0; 14 }
第三题 王韬韬学长之喝可乐(返回顶部)
题意:输入一个数字n,代表可以拿到n个空瓶子,4个空瓶子可以换一瓶可乐,然后三个空瓶子可以问老板借一个,换完可乐后还完。
思路:因为三个空瓶子可以换完,所以直接除3即可
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 long long n; 6 while(~scanf("%lld",&n)){ 7 printf("%lld\n",n/3); 8 } 9 return 0; 10 }
第四题 Thanos sort 灭霸の无限手套(返回顶部)
题意:数组三等分,然后获得最长非降序数组的大小是多少
思路:暴力模拟
1 #include<stdio.h> 2 int a[88]; 3 int main() 4 { 5 int t,n; 6 while(~scanf("%d",&t)){ 7 while(t--){ 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++){ 10 scanf("%d",&a[i]); 11 } 12 int minn=1; 13 for(int i=3;i<=n;i*=3){ 14 for(int j=1;j<=n;j+=i){ 15 int f=0; 16 for(int k=j+1;k<j+i;k++){ 17 if(a[k-1]>a[k]){ 18 f=1; 19 break; 20 } 21 } 22 if(!f){ 23 minn=i;break; 24 } 25 } 26 } 27 printf("%d\n",minn); 28 } 29 } 30 return 0; 31 }
第五题 云云姐的奇妙键盘 (返回顶部)
题意:键盘输入0,会输出两个1,现在给一串数字字符串,问有多少种输入情况
思路:斐波那契(参考跳阶梯)
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstdlib> 6 #include<set> 7 #include<map> 8 #include<cmath> 9 #include<queue> 10 #include<functional> 11 #define mem(a,b) memset(a,b,sizeof(a)) 12 #define inf 0x3f3f3f3f 13 #define ll long long 14 #define mod 1000000007 15 using namespace std; 16 const int maxn=1e5+10; 17 int dp[maxn]; 18 char s[maxn]; 19 int main(){ 20 while(~scanf("%s",s+1)){ 21 int l=strlen(s+1); 22 dp[0]=1,dp[1]=1; 23 for(int i=2;i<=l;i++){ 24 if(s[i]=='1' && s[i-1]=='1'){ 25 dp[i]=(dp[i-1]+dp[i-2])%mod; 26 } 27 else{ 28 dp[i]=dp[i-1]; 29 } 30 } 31 printf("%d\n",dp[l]); 32 } 33 return 0; 34 }
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int maxn=100005; 5 ll mod=1e9+7; 6 ll p[maxn]; 7 int main() 8 { 9 p[0]=1; 10 p[1]=1; 11 for(int i=2; i<maxn; i++) 12 { 13 p[i]=(p[i-1]+p[i-2])%mod; 14 } 15 char q[maxn]; 16 while(~scanf("%s",q)) 17 { 18 int len=strlen(q); 19 ll sum=1; 20 int d=0; 21 for(int i=0; i<len; i++) 22 { 23 if(q[i]=='1') 24 { 25 d++; 26 } 27 else 28 { 29 sum=sum*p[d]%mod; 30 d=0; 31 } 32 } 33 if(d) 34 { 35 sum=sum*p[d]%mod; 36 } 37 printf("%lld\n",sum); 38 } 39 return 0; 40 }
第六题 云云姐想要染色(返回顶部)
题意:给了1,2,3种颜色的位置,给1,2,3颜色的每个位置的价钱,求最小总价即可
思路:暴力模拟
1 #include<stdio.h> 2 int min(int a,int b){ 3 return a<b?a:b; 4 } 5 int a[1010][3]; 6 int q,p,n; 7 int jia[1010]; 8 int main() 9 { 10 while(~scanf("%d",&n)){ 11 for(int i=0;i<3;i++){ 12 for(int j=0;j<n;j++){ 13 scanf("%d",&a[j][i]); 14 } 15 } 16 for(int i=0;i<n;i++){ 17 scanf("%d",&jia[i]); 18 jia[i]--; 19 } 20 int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0; 21 for(int i=0;i<n;i++){ 22 if(jia[i]==0){ 23 sum1+=a[i][0]; 24 sum2+=a[i][1]; 25 sum3+=a[i][2]; 26 sum4+=a[i][0]; 27 sum5+=a[i][1]; 28 sum6+=a[i][2]; 29 } 30 else if(jia[i]==1){ 31 sum1+=a[i][1]; 32 sum2+=a[i][2]; 33 sum3+=a[i][0]; 34 sum4+=a[i][2]; 35 sum5+=a[i][0]; 36 sum6+=a[i][1]; 37 } 38 else if(jia[i]==2){ 39 sum1+=a[i][2]; 40 sum2+=a[i][0]; 41 sum3+=a[i][1]; 42 sum4+=a[i][1]; 43 sum5+=a[i][2]; 44 sum6+=a[i][0]; 45 } 46 } 47 int mi=min(min(min(sum1,sum4),min(sum2,sum3)),min(sum5,sum6)); 48 printf("%d\n",mi); 49 } 50 return 0; 51 }
第七题 云云姐梦游仙境之决战史莱姆(返回顶部)
题意:输入n,再输入n个数,再输出数字m,问n个数里面的一些数字可不可以组成m
思路:dfs或者dp都可以过
1 #include<stdio.h> 2 const int maxn=1e4+10; 3 int a[15],m,n; 4 bool flag; 5 void dfs(int i,int sum){ 6 if(sum==m){ 7 flag=true;return; 8 } 9 if(i==n){ 10 return; 11 } 12 if(flag){ 13 return; 14 } 15 dfs(i+1,sum+a[i]); 16 dfs(i+1,sum); 17 } 18 int main() 19 { 20 while(~scanf("%d",&n)){ 21 for(int i=0;i<n;i++){ 22 scanf("%d",&a[i]); 23 } 24 scanf("%d",&m); 25 flag=false; 26 dfs(0,0); 27 if(flag){ 28 printf("YES\n"); 29 } 30 else{ 31 printf("NO\n"); 32 } 33 } 34 return 0; 35 }
第八题 王韬韬学长之买绳子(返回顶部)
题意:题目说的比较清晰了,这里就不说了
思路:前缀和+求和公式
1 #include<iostream> 2 #include<algorithm> 3 #include<math.h> 4 #include<cstdio> 5 #include<cstring> 6 #define ll long long 7 using namespace std; 8 const int maxn=100005; 9 int main() 10 { 11 int p[maxn],p1[maxn],n,m,q; 12 while(~scanf("%d%d",&n,&m)){ 13 p[0]=0; 14 memset(p1,0,sizeof(p1)); 15 for(int i=1;i<=n;i++){ 16 scanf("%d",&q); 17 p[i]=(p[i-1]+q)%m;//统计每个数包括他之前所有数之后和m的余数 18 p1[p[i]]++;//统计余数的数量 19 } 20 ll sum=0; 21 for(int i=0;i<m;i++){ 22 if(!i){ 23 sum=sum+p1[0]+(ll)p1[0]*(p1[0]-1)/2;//当余数为0的时候,我们共有p1[0]+(ll)p1[0]*(p1[0]-1)/2种选择 24 } 25 else{ 26 sum=sum+(ll)p1[i]*(p1[i]-1)/2;//当余数不为0的时候,我们共有p1[i]*(p1[i]-1)/2种选择 27 } 28 } 29 printf("%lld\n",sum); 30 } 31 return 0; 32 }
第九题 Zxh学长的奇妙游戏(返回顶部)
题意:这题题目也是比较清晰了,这里就不说了
思路:找下规律,前缀和,然后排序,加n-m
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #include<functional> 10 #define ll long long 11 #define mem(a,b) memset(a,b,sizeof(a)) 12 #define rep(i,a,b) for(int i=a;i<=b;i++) 13 using namespace std; 14 const int maxn=3e6+10; 15 int s[maxn]; 16 int t,n,m,a,b; 17 int main() 18 { 19 while(~scanf("%d%d",&n,&m)){ 20 scanf("%d",&a); 21 int aa=a; 22 if(n==1){ 23 printf("0\n");continue; 24 } 25 int t=0; 26 for(int i=1;i<n;i++){ 27 scanf("%d",&b); 28 s[t++]=b-a; 29 a=b; 30 } 31 if(m==1){ 32 printf("%d\n",b-aa);continue; 33 } 34 sort(s,s+t); 35 int sum=0; 36 for(int i=0;i<n-m;i++){ 37 sum+=s[i]; 38 } 39 printf("%d\n",sum); 40 } 41 return 0; 42 }
第十题 众神所眷恋的幻想乡(返回顶部)
题意:题目过长,emmm,就是有两个boss有特殊技能,也会横、竖技能,一个boss会地图全覆盖,但问题是boss的实体的会挡住boss的技能走向,另一个boss会斜着发射十字架的技能。问有没有地方可以全躲,如果有输出yes,横坐标最小,再选择纵坐标最小;如果无,输出no
思路:模拟
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #define mem(a,b) memset(a,b,sizeof(a)) 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 int g[110][110]; 8 int n,m,k,sx,sy,t,xx,yy,ji; 9 void jiuheng(int x,int y){ 10 if(sx==x && sy==y){return;} 11 for(int i=y;i<=m;i++){ 12 if(sx==x && sy==i){break;} 13 g[x][i]=1; 14 } 15 for(int i=y;i>=1;i--){ 16 if(sx==x && sy==i){break;} 17 g[x][i]=1; 18 } 19 } 20 void jiuzhong(int x,int y){ 21 if(sx==x && sy==y){return;} 22 for(int i=x;i<=n;i++){ 23 if(sx==i && sy==y){break;} 24 g[i][y]=1; 25 } 26 for(int i=x;i>=1;i--){ 27 if(sx==i && sy==y){break;} 28 g[i][y]=1; 29 } 30 } 31 void er(int x,int y){ 32 int x1=x,y1=y;if(sx==x1 && sy==y1){return;} 33 while(x1>0 && y1>0){ 34 g[x1][y1]=1;x1--;y1--;if(sx==x1 && sy==y1){break;} 35 } 36 x1=x,y1=y; 37 while(x1<=n && y1>0){ 38 g[x1][y1]=1;x1++;y1--;if(sx==x1 && sy==y1){break;} 39 } 40 x1=x,y1=y; 41 while(x1>0 && y1<=m){ 42 g[x1][y1]=1;x1--;y1++;if(sx==x1 && sy==y1){break;} 43 } 44 x1=x,y1=y; 45 while(x1<=n && y1<=m){ 46 g[x1][y1]=1;x1++;y1++;if(sx==x1 && sy==y1){break;} 47 } 48 } 49 void dd(int a,int b,int c){ 50 if(sx==a && sy==b){return;} 51 if(c==1){ 52 jiuheng(a,b); 53 }else if(c==2){ 54 jiuzhong(a,b); 55 }else{ 56 if(k==9){ 57 for(int i=b;i<=m;i++){ 58 if(sx==a && sy==i){break;} 59 jiuzhong(a,i); 60 } 61 for(int i=b;i>=1;i--){ 62 if(sx==a && sy==i){break;} 63 jiuzhong(a,i); 64 } 65 }else{ 66 er(a,b); 67 } 68 } 69 } 70 int main(){ 71 while(~scanf("%d%d%d%d%d%d",&n,&m,&k,&sx,&sy,&t)){ 72 mem(g,0); 73 g[sx][sy]=2; 74 for(int i=0;i<t;i++){ 75 scanf("%d%d%d",&ji,&xx,&yy); 76 dd(xx,yy,ji); 77 } 78 int aa=1;g[sx][sy]=2; 79 for(int i=1;i<=n;i++){ 80 for(int j=1;j<=m;j++){ 81 if(!g[i][j]){ 82 printf("yes\n%d %d\n",i,j); 83 aa=0;break; 84 } 85 } 86 if(!aa){break;} 87 } 88 if(aa){ 89 printf("no\n"); 90 } 91 } 92 return 0; 93 }
第十一题 顾十二的神秘数字(返回顶部)
题意:这题是pat乙级的原题,题意很清楚
思路:模拟 或者 搜索
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<vector> 6 #include<assert.h> 7 #include<cstring> 8 #include<map> 9 #include<stack> 10 #include<queue> 11 #define ll long long 12 using namespace std; 13 int xj(int x){ 14 int su=0; 15 while(x){ 16 su+=x%10; 17 x/=10; 18 } 19 return su; 20 } 21 bool prime(int a){ 22 if(a<3){ 23 return false; 24 } 25 for(int i=2;i*i<=a;i++){ 26 if(a%i==0){ 27 return false; 28 } 29 } 30 return true; 31 } 32 struct node{ 33 int x,y; 34 }; 35 node a[5000000]; 36 bool cmp(node a,node b){ 37 if(a.x==b.x){ 38 return a.y<b.y; 39 } 40 else{ 41 return a.x<b.x; 42 } 43 } 44 int gcd(int a,int b){ 45 return a%b==0?b:gcd(b,a%b); 46 } 47 int main() 48 { 49 int t,k,m; 50 int i; 51 while(~scanf("%d",&t)){ 52 while(t--){ 53 scanf("%d%d",&k,&m); 54 int d=1; 55 int e=0; 56 for( i=1; i<k; i++){ 57 d*=10; 58 } 59 for(i=d+99;i<=d*10; i+=100){ 60 if(xj(i)==m&&prime(gcd(xj(i+1),xj(i)))){ 61 a[e].x=xj(i+1); 62 a[e++].y=i; 63 } 64 } 65 if(e==0){ 66 printf("N0 Solution\n"); 67 } 68 else{ 69 sort(a,a+e,cmp); 70 for(i=0;i<e;i++){ 71 printf("%d %d\n",a[i].x,a[i].y); 72 } 73 } 74 } 75 } 76 return 0; 77 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pi acos(-1) 4 #define ll long long 5 const int N = 100001; 6 const ll mod = 1000000007; 7 int gcd(int a,int b){return b==0?a:gcd(b,a%b);} 8 int isp(int n){ 9 if(n<=2)return 0; 10 for(int i=2;i*i<=n;i++) 11 if(n%i==0)return 0; 12 return 1; 13 } 14 int fg; 15 int a[20]; 16 17 void dfs(int l,int ed,int num,int n,int x){ 18 if(num<0)return ; 19 if(l==ed){ 20 if(num>8)return ; 21 cout<<x<<" "; 22 for(int i=1;i<ed;i++)cout<<a[i]; 23 cout<<num; 24 for(int i=0;i<n;i++)cout<<9; 25 cout<<endl; 26 fg=1; 27 return ; 28 } 29 for(int i=0;i<10;i++){ 30 if(i==0&&l==1)continue; 31 a[l]=i; 32 dfs(l+1,ed,num-i,n,x); 33 } 34 } 35 int main() 36 { 37 int t,k,m; 38 cin>>t; 39 while(t--){ 40 fg=0; 41 cin>>k>>m; 42 for(int i=k-1;i>0;i--){ 43 int n=m-i*9+1; 44 if(n<=0)continue; 45 if(isp(gcd(n,m))){ 46 dfs(1,k-i,n-1,i,n); 47 } 48 } 49 if(!fg)cout<<"N0 Solution"<<endl; 50 } 51 return 0; 52 }
记得补题,题目两小时半还是挺困难ak的,毕竟我验题也验了几天的时间,题目基本没有锅。题目基本属于简单题
我的三道题都是很基本的题目,希望大家补题
这些题解都是我写的,如果有疑问可以qq问我
所有的核心代码都是c语言构成,无除社团课之外的知识点。