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("
");
17                 }
18             }
19             else{
20                 printf("0
");
21             }
22     }
23     return 0;
24 }
View Code

 

第二题 秋姐妹鸣泣之时 秋日天空下 (返回顶部)

 

题意:输入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
");
11         }
12     }
13     return 0;
14 }
View Code

 

第三题 王韬韬学长之喝可乐(返回顶部)

 

题意:输入一个数字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/3);
 8     }
 9     return 0;
10 }
View Code

 

第四题 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
",minn);
28         }
29     }
30     return 0;
31 }
View Code

 

第五题 云云姐的奇妙键盘 (返回顶部)

 

题意:键盘输入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
",dp[l]);
32     }
33     return 0;
34 }
View Code
 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
",sum);
38     }
39     return 0;
40 }
View Code

 

第六题 云云姐想要染色(返回顶部)

 

题意:给了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
",mi);
49     }
50     return 0;
51 }
View Code

 

第七题 云云姐梦游仙境之决战史莱姆(返回顶部)

 

题意:输入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
");
29         }
30         else{
31             printf("NO
");
32         }
33     }
34     return 0;
35 }
View Code

 

第八题 王韬韬学长之买绳子(返回顶部)

 

题意:题目说的比较清晰了,这里就不说了

思路:前缀和+求和公式

 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
",sum);
30     }
31     return 0;
32 }
View Code

 

第九题  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
");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
",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
",sum);
40     }
41     return 0;
42 }
View Code

 

第十题 众神所眷恋的幻想乡(返回顶部)

 

题意:题目过长,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
%d %d
",i,j);
83                     aa=0;break;
84                 }
85             }
86             if(!aa){break;}
87         }
88         if(aa){
89             printf("no
");
90         }
91     }
92     return 0;
93 }
View Code

 

第十一题 顾十二的神秘数字(返回顶部)

 

题意:这题是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
");
67             }
68             else{
69                 sort(a,a+e,cmp);
70                 for(i=0;i<e;i++){
71                     printf("%d %d
",a[i].x,a[i].y);
72                 }
73             }
74         }
75     }
76     return 0;
77 }
View Code
 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 }
View Code

记得补题,题目两小时半还是挺困难ak的,毕竟我验题也验了几天的时间,题目基本没有锅。题目基本属于简单题

我的三道题都是很基本的题目,希望大家补题

这些题解都是我写的,如果有疑问可以qq问我

所有的核心代码都是c语言构成,无除社团课之外的知识点。

upd(12/8)心有点凉了……都手搓爱心,公式都不用。

原文地址:https://www.cnblogs.com/luoyugongxi/p/11983916.html