zoukankan      html  css  js  c++  java
  • 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)心有点凉了……都手搓爱心,公式都不用。

  • 相关阅读:
    jQuery初学:find()方法及children方法的区别分析
    百万级访问网站前期的技术准备
    TCP/IP协议三次握手与四次握手流程解析
    TCP/IP详解学习笔记
    Dubbo框架入门介绍
    如何提高Web服务端并发效率的异步编程技术
    杂 -- 有关程序员
    关于高性能的那点事
    大型网站的灵魂- 性能
    分布式java应用
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/11983916.html
Copyright © 2011-2022 走看看