ypACM社團年終賽暨實驗室選拔賽題解


第一題 帥學長的愛心

第二題 秋姐妹鳴泣之時 秋日天空下

第三題 王韜韜學長之喝可樂

第四題 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 }
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\n");
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",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\n",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\n",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\n",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\n",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\n");
29         }
30         else{
31             printf("NO\n");
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\n",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\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 }
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\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 }
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\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 }
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)心有點涼了……都手搓愛心,公式都不用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM