• The 10th SWJTU Collegiate Programming Contest


    Problem A: SRTP
     对两行分别求和,比较大小
     1 #include <iostream>
     2 #include <cmath>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 using namespace std;
     8 int main()
     9 {
    10     int t,a,i,j,sum1,sum2,n,m;
    11     cin>>t;
    12     {
    13         for(i=1;i<=t;i++)
    14         {
    15             cin>>n>>m;
    16             sum1=sum2=0;
    17             for(j=1;j<=n;j++)
    18             {
    19                 cin>>a;
    20                 sum1+=a;
    21 
    22             }
    23             for(j=1;j<=m;j++)
    24             {
    25                 cin>>a;
    26                 sum2+=a;
    27 
    28             }
    29             if(sum1>sum2)   cout<<"Terry"<<endl;
    30             else if(sum1<sum2) cout<<"Dante"<<endl;
    31             else cout<<"Draw"<<endl;
    32         }
    33     }
    34 
    35 }
    A
     
     
    Problem B: 2048
    模拟U,D,R,L四种操作
      1 #include<cstdio>
      2 #include<cstring>
      3 
      4 int a[10][10];
      5 
      6 void fun(char c)
      7 {
      8       int i,j,n1,n2,k;
      9       int b[10],tmp[10];
     10 
     11       if(c=='U')
     12       {
     13             for(j=1;j<=4;j++)  //  ??
     14                   {
     15                         n1=0;
     16                         for(i=1;i<=4;i++)
     17                              if(a[i][j]!=0) b[++n1]=a[i][j];
     18                         n2=0;
     19                        /* printf("b:");
     20                         for(i=1;i<=n1;i++)
     21                               printf("%d ",b[i]);
     22                         printf("
    ");
     23                         */
     24                         for(i=1;i<=n1;i++)
     25                               if(i==n1) tmp[++n2]=b[i];
     26                               else {
     27                                     if(b[i]==b[i+1]) tmp[++n2]=b[i]*2,i++;
     28                                     else tmp[++n2]=b[i];
     29                               }
     30 
     31 
     32                         for(i=1;i<=n2;i++)
     33                               a[i][j]=tmp[i];
     34                         for(i=n2+1;i<=4;i++)
     35                               a[i][j]=0;
     36                   }
     37 
     38 
     39       }
     40 
     41       if(c=='D')
     42       {
     43             for(j=1;j<=4;j++)  //  ??
     44                   {
     45                         n1=0;
     46                         for(i=4;i>=1;i--)
     47                              if(a[i][j]!=0) b[++n1]=a[i][j];
     48                         n2=0;
     49                        /* printf("b:");
     50                         for(i=1;i<=n1;i++)
     51                               printf("%d ",b[i]);
     52                         printf("
    ");
     53                         */
     54                         for(i=1;i<=n1;i++)
     55                               if(i==n1) tmp[++n2]=b[i];
     56                               else {
     57                                     if(b[i]==b[i+1]) tmp[++n2]=b[i]*2,i++;
     58                                     else tmp[++n2]=b[i];
     59                               }
     60 
     61 
     62                         for(i=1,k=4;i<=n2;i++,k--)
     63                               a[k][j]=tmp[i];
     64                         for(int i1=k;i1>=1;i1--)
     65                               a[i1][j]=0;
     66                   }
     67 
     68       }
     69 
     70 
     71       if(c=='L')
     72       {
     73             for(i=1;i<=4;i++)   // ??
     74             {
     75 
     76                   n1=0;
     77                   for(j=1;j<=4;j++)
     78                         if(a[i][j]!=0) b[++n1]=a[i][j];
     79                   n2=0;
     80                   for(j=1;j<=n1;j++)
     81                   if(j==n1) tmp[++n2]=b[j];
     82                   else {
     83                         if(b[j]==b[j+1]) tmp[++n2]=b[j]*2,j++;
     84                         else tmp[++n2]=b[j];
     85 
     86                   }
     87 
     88                   for(j=1;j<=n2;j++)
     89                         a[i][j]=tmp[j];
     90                   for(j=n2+1;j<=4;j++)
     91                         a[i][j]=0;
     92 
     93             }
     94       }
     95 
     96       if(c=='R')
     97       {
     98             for(i=1;i<=4;i++)   // ??
     99             {
    100 
    101                   n1=0;
    102                   for(j=4;j>=1;j--)
    103                         if(a[i][j]!=0) b[++n1]=a[i][j];
    104                   n2=0;
    105                   for(j=1;j<=n1;j++)
    106                   if(j==n1) tmp[++n2]=b[j];
    107                   else {
    108                         if(b[j]==b[j+1]) tmp[++n2]=b[j]*2,j++;
    109                         else tmp[++n2]=b[j];
    110 
    111                   }
    112 
    113                   for(j=1,k=4;j<=n2;j++,k--)
    114                         a[i][k]=tmp[j];
    115                   for(int j1=k;j1>=1;j1--)
    116                         a[i][j1]=0;
    117 
    118             }
    119       }
    120 
    121 
    122 }
    123 
    124 
    125 
    126 int main()
    127 {
    128       int i,j;
    129       char s[10005];
    130 
    131       while(~scanf("%d%d%d%d",&a[1][1],&a[1][2],&a[1][3],&a[1][4]))
    132       {
    133             for(i=2;i<=4;i++)
    134                   for(j=1;j<=4;j++)
    135                         scanf("%d",&a[i][j]);
    136 
    137             scanf("%s",s);
    138             int len=strlen(s);
    139             for(i=0;i<len;i++)
    140                   {
    141                         fun(s[i]);
    142 
    143 
    144                   }
    145 
    146             for(i=1;i<=4;i++)
    147             {
    148                   for(j=1;j<=4;j++)
    149                         printf("%5d",a[i][j]);
    150                   printf("
    ");
    151             }
    152             
    153             printf("
    ");
    154       }
    155 
    156 
    157 
    158       return 0;
    159 
    160 }
    B
     
     
    Problem C: What's Her Name?
    统计g,u,a,n,j,i出现次数。
    (g-1),u,a,(n/2),j,i中的最小值即为字符串可能出现的最大次数
    注意:(g-1)可能小于零,此时特判答案为0.
     1 #include <iostream>
     2     #include <cmath>
     3     #include <string>
     4     #include <cstdio>
     5     #include <cstring>
     6     #include <algorithm>
     7     using namespace std;
     8     int main()
     9     {
    10         //string ans="guanjing";
    11         int flag[110];
    12       //  freopen("data.in","r",stdin);
    13        // freopen("data.out","w",stdout);
    14         int t,a,i,j,sum1,sum2,n,m,sum,l,cnt,now,ans;
    15         string s;
    16         while(cin>>s)
    17         {
    18             cnt=0;
    19             l=s.length();
    20             memset(flag,0,sizeof(flag));
    21             for(i=0;i<l;i++)
    22             if(s[i]=='g') flag[1]++;
    23             else if (s[i]=='u') flag[2]++;
    24             else if (s[i]=='a') flag[3]++;
    25             else if (s[i]=='n') flag[4]++;
    26             else if (s[i]=='j') flag[5]++;
    27             else if (s[i]=='i') flag[6]++;
    28 
    29             ans=min(flag[1]-1,min(flag[2],min(flag[3],min(flag[4]/2,min(flag[5],flag[6])))));
    30             if (ans<0) ans=0;
    31             cout<<ans<<endl;
    32         }
    33     }
    C

    Problem D: Skip Classes?

    水题

     1 #include <iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int a[1005];
     5 int main()
     6 {
     7     int x,y,i,j,k,n,m;
     8     int ans;
     9     while(~scanf("%d%d%d",&n,&m,&k))
    10     {
    11           x=0;
    12           ans=0;
    13           for(i=0;i<n;i++)
    14             {
    15                   scanf("%d",&a[i]);
    16                   if(a[i]==1) x++;
    17             }
    18            y=n-x;
    19            if(y>k)
    20            {
    21                  x+=y-k;
    22                  if(x>m) ans+=x-m;
    23            }else{
    24                   if(x>m) ans+=x-m;
    25            }
    26            printf("%d
    ",ans);
    27     }
    28     return 0;
    29 }
    D

    Problem E: Sequence

    动态规划

    dp[n][k]=dp[n][k]+dp[n/i][k-1]    (i=1~n)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <string>
     5 using namespace std;
     6 int dp[2003][2003];
     7 int solve(int n, int k)
     8 {
     9     if(n==1) return 1;
    10     if(k==1) return n;
    11     if(dp[n][k]) return dp[n][k];
    12 
    13     for (int i = 1; i <= n; ++i)
    14     {
    15         dp[n][k]=(dp[n][k]+solve(n/i,k-1))%(20120354);
    16     }
    17     return dp[n][k];
    18 }
    19 int main()
    20 {
    21     int n, k;
    22     while(~scanf("%d%d",&n,&k))
    23     cout<<solve(k, n)<<endl;
    24     return 0;
    25 }
    E
     
     
    Problem F: Share Candies
    1 不会。
    2 请各位看官@憨大哥@管大神
    F
     
     
    Problem G: Fibonacci Prime
    除了前几个,下标为素数的菲波那契数其实就是题目说的菲波那契素数。
    K最大又只有20,背一下100以内的素数。。
     1 #include <iostream>
     2 #include <cmath>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 using namespace std;
     8 int outcome[65]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,81,89};
     9 
    10 int main()
    11 {
    12     //freopen("data.in","r",stdin);
    13    // freopen("data.out","w",stdout);
    14     unsigned long long ans;
    15     int t,a,i,j,sum1,sum2,n,m,sum;
    16     long long f[300];
    17     f[1]=f[2]=1;
    18     for(i=3;i<=299;i++)
    19         f[i]=f[i-1]+f[i-2];
    20     while(cin>>n)
    21     {
    22     if(n==1) cout<<2<<endl;
    23     else if(n==2) cout<<3<<endl;
    24     else if(n==3) cout<<5<<endl;
    25     else if(n==4) cout<<13<<endl;
    26     else cout<<f[outcome[n]]<<endl;
    27 
    28     }
    29 }
    G

    Problem H: A + B Again

    1、无限循环小数化分数:

    比如说对于一个无限循环小数0.(4),用我们中学数学中学到的方法,令X = 0.(4),则10 * X = 4.(4) = 4 + 0.(4) = 4 + X     =>     X = 4 / 9,同理,首先将题中所给出的小数转化为0.(***)的形式,然后再采用上述所示的方法即可。

    度娘

    2、分数相加
    3、约分
     1     #include <iostream>
     2     #include<cstdio>
     3     #include<cstring>
     4     using namespace std;
     5 
     6     long long gcd(long long a,long long b)
     7     {
     8           return b==0?a:gcd(b,a%b);
     9     }
    10 
    11     void fun(char *s,long long *a,long long *b)
    12     {
    13           long long i,j,k,p,n,nl,ml,m,flag=0,g;
    14           long long  len=strlen(s);
    15 
    16           for(j=0;j<len;j++)
    17           if(s[j]=='(') {flag=1; break;}
    18 
    19           if(flag)  // ????????
    20           {
    21                 for(i=0;i<len && s[i]!='.';i++);
    22                 p=0;  //????????
    23 
    24                 for(long long i1=0;i1<i;i1++)
    25                       p=p*10+s[i1]-'0';
    26 
    27                 n=0;  
    28                  for(long long i1=i+1;i1<j;i1++)
    29                       n=n*10+s[i1]-'0';
    30                 nl=j-i-1;
    31 
    32                 m=n;
    33                 for(k=j+1;k<len && s[k]!=')';k++);
    34 
    35                 for(long long i1=j+1;i1<k;i1++)
    36                     m=m*10+s[i1]-'0';
    37 
    38                 ml=k-i-2;
    39                 *b=9;   // ????
    40                 for(long long i1=1;i1<ml-nl;i1++)
    41                       *b=*b*10+9;
    42                 for(long long i1=1;i1<=nl;i1++)
    43                       *b=*b*10;
    44 
    45                  *a=(m-n)+(*b)*p;
    46 
    47                  g=gcd(*a,*b);
    48                 *a=*a/g; *b=*b/g;
    49 
    50           }else{  //  ??????????
    51                 for(i=0;i<len && s[i]!='.';i++);
    52                 p=0;  //????????
    53 
    54                 for(long long i1=0;i1<i;i1++)
    55                       p=p*10+s[i1]-'0';
    56 
    57                 nl=len-1-i;
    58                 n=1;   // ????
    59                 for(long long i1=1;i1<=nl;i1++)
    60                       n=n*10;
    61 
    62                 ml=nl;
    63                 m=0;  // ????
    64                 for(long long i1=i+1;i1<len;i1++)
    65                       m=m*10+s[i1]-'0';
    66 
    67                 *a=n*p+m;
    68                 *b=n;
    69                 
    70                 g=gcd(*a,*b);
    71                 *a=*a/g; *b=*b/g;
    72               //
    73 
    74           }
    75     }
    76     int main()
    77     {
    78         int ncase;
    79         long long a1,b1,a2,b2;
    80         long long a,b,g;
    81         char s1[1005],s2[1005];
    82 
    83         scanf("%d",&ncase);
    84         while(ncase--)
    85         {
    86               scanf("%s%s",s1,s2);
    87               fun(s1,&a1,&b1);
    88               fun(s2,&a2,&b2);
    89                 a=a1*b2+a2*b1;
    90                 b=b1*b2;
    91                 g=gcd(a,b);
    92                 printf("%lld/%lld
    ",a/g,b/g);
    93         }
    94 
    95 
    96 
    97         return 0;
    98     }
    H

    Problem I: Digits' Sum

    暴力打表 或者 快速幂

    对于N=64的数据进行特判。

     1 #include <iostream>
     2 #include <cmath>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 using namespace std;
     8 int outcome[65]={1,2,4,8,7,5,10,11,13,8,7,14,19,20,22,26,25,14,19,29,31,26,25,41,37,29,40,35,43,41,37,47,58,62,61,59,64,56,67,71,61,50,46,56,58,62,70,68,73,65,76,80,79,77,82,92,85,80,70,77,82,74,85,89,88};
     9 unsigned long long mul(unsigned long long a,unsigned long long b)
    10 {
    11     unsigned long long ans;
    12     ans=1;
    13     while(b)
    14     {
    15         if(b&1)
    16             ans=ans*a;
    17         b>>=1;
    18         a*=a;
    19     }
    20     return ans;
    21 }
    22 int main()
    23 {
    24     //freopen("data.in","r",stdin);
    25     //freopen("data.out","w",stdout);
    26     unsigned long long ans;
    27     int t,a,i,j,sum1,sum2,n,m,sum;
    28     while(cin>>n)
    29         cout<<outcome[n]<<endl;
    30         
    31     用快速幂打表:    
    32     //for(n=0;n<=63;n++)
    33     
    34      //   ans=mul(2,n);
    35        // cout<<ans<<endl;
    36      //   sum=0;
    37      //   while(ans)
    38     //    {
    39      //       sum+=ans%10;
    40     //        ans/=10;
    41     //    }
    42     //      if(n==64) sum=88;
    43     //    cout<<sum<<endl;
    44     
    45 }
    I

     

  • 相关阅读:
    js如何求一组数中的极值
    五星评分效果 原生js
    省市区三级联动
    jq表头固定
    css垂直居中 两种方法
    node.js grunt文件压缩
    js 定时器
    动态规划---最长公共子序列
    AES,RSA对称加密和非对称加密
    正则表达式学习笔记
  • 原文地址:https://www.cnblogs.com/-dante-/p/3662568.html
Copyright © 2020-2023  润新知