zoukankan      html  css  js  c++  java
  • 第一次组队比赛

    网站:http://www.bnuoj.com/bnuoj/contest_show.php?cid=2009#info

    A,水题,不解释;

    B ,放代码

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string>
     5 #include<string.h>
     6 using namespace std;
     7 int main()
     8 {
     9     int a,b,s=0,n,i=0,x;
    10     char d,c[5];
    11         while(scanf("%d%c%d%*c%s",&a,&d,&b,c)!=EOF)
    12         {
    13             i++;
    14             if(d=='+')
    15             n=a+b;
    16         else
    17             n=a-b;
    18         if(n<0&&c[0]=='?')
    19             s++;
    20         else
    21         {
    22             x=strlen(c);
    23             if(x==1&&n==(c[0]-'0')&&n>=0&&n<10)
    24             s++;
    25             else if(x==2&&n>9&&n<100&&(n%10==c[1]-'0')&&(n/10==c[0]-'0'))
    26                 s++;
    27             else if(n>99&&x==3&&(n%10==c[2]-'0')&&((n/10)%10==c[1]-'0')&&(n/100==c[0]-'0'))
    28                 s++;
    29         }
    30             if(i==100)
    31                 break;
    32         }
    33         printf("%d
    ",s);
    34         return 0;
    35 }

    C,也不解释,放代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 int main()
     4 {
     5     char a[1000];
     6     int b[1000],i,flag,n;
     7     while(scanf("%s",a) && a[0]!='0')
     8     {
     9             flag=0;
    10             n=strlen(a);
    11             for(i=0;i<n;i++)
    12                  b[i]=a[i]-'0';
    13             for(i=0;i<n-1;i++)
    14             {
    15                 flag=flag*10+b[i];   //一位位取余
    16                 flag=flag%17;
    17             }
    18             flag=(flag-b[n-1]*5)%17;
    19             if(flag) 
    20                  printf("0
    ");
    21             else 
    22                 printf("1
    ");
    23     }
    24    return 0;
    25 }

    D:....先不写....

    E:水题,不解释。

    F:不难,就是输出“-1”那略坑,根本没有输出-1的时候嘛.....

     1 #include <stdio.h>
     2 int judge(int n)
     3 {
     4     if(n%7==0)
     5         return 1;
     6     while(n)   //等于0跳出
     7     {
     8         if(n%10==7) return 1;  //或者有一位数为7跳出
     9          n/=10;
    10     }
    11     return 0;
    12 }
    13 int main()
    14 {
    15     int n,m,k;
    16     while(~scanf("%d%d%d",&n,&m,&k)&& (n||m||k))
    17     {
    18         int cur=1,add,num=0;
    19         while(k)
    20         {
    21             ++num;
    22             if(cur==m)
    23                 k-=judge(num);
    24             if(cur==n) add=-1;  
    25             if(cur==1) add=1;
    26             cur+=add;
    27         }
    28         printf("%d
    ",num);
    29     }
    30     return 0;
    31 }

    G:找规律~

     1 #include <stdio.h>
     2 #include<iostream>
     3 using namespace std;
     4 int main()
     5 {
     6     int n,sum;
     7     while(~scanf("%d",&n)&&n)
     8     {
     9         sum=1;
    10         for(;;)
    11         {
    12             sum=sum*2+1;
    13             if(n<=sum)
    14                 break;
    15         }
    16         if(n==sum)
    17             printf("Bob
    ");
    18         else
    19             printf("Alice
    ");
    20     }
    21     return 0;
    22 }

    另附上网上有力的解释:

       首先分析简单的情况,数字代表最大堆,2必胜,3必输,4必胜,……其实偶数必胜是显然的,但奇数就不好说了,于是我们换个角度考虑。

        如果说3必输的话,那么最后能把最大堆是3的情况留给Bob那么自己必然会赢,而能确保最大堆是3的情况就只有4、5、6了,而对于7,无论自己如何设置,都会把4、5、6其中的一个留给Bob,故自己必输。

        同理,7必输的话,把7留给Bob就必胜,于是……

        这样推完,其实Bob能赢的情况就是在n=2^k-1(k = 2, 3, 4,…)的时候,其他时候Alice都是必胜的。

    H......

    I:我现在都不知道错哪......

    先贴上正确的代码:

     1 #include <stdio.h>   
     2 #include <string.h>   
     3 #include <iostream>   
     4 #include <string>   
     5   
     6 using namespace std;  
     7   
     8 int map[122][122];  
     9   
    10 int N, K, M;  
    11   
    12 int main()  
    13 {  
    14     int T;  
    15     int a, b;  
    16     while (scanf("%d", &T) != EOF)  
    17     {  
    18         while (T--)  
    19         {  
    20             memset(map, 0, sizeof(map));  
    21             scanf("%d%d%d", &N, &M, &K);  
    22             for (int i = 0; i < M; i++)  
    23             {  
    24                 scanf("%d%d", &a, &b);  
    25                 map[a][b] = 1;  
    26                 map[b][a] = 1;  
    27             }  
    28             int ans = 0;  
    29             while (1)  
    30             {  
    31                 int count = 0;  
    32                 for (int i = 0; i < N - 1; i++)  
    33                 {  
    34                     for (int j = i + 1; j < N; j++)  
    35                     {  
    36                         int cnt = 0;  
    37                         if (!map[i][j])  
    38                         {  
    39                             for (int k = 0; k < N; k++)  
    40                             {  
    41                                 if (map[i][k] && map[j][k])  
    42                                 {  
    43                                     cnt++;  
    44                                 }  
    45                             }  
    46                             if (cnt >= K && !map[i][j])  
    47                             {  
    48                                 map[i][j] = 1;  
    49                                 map[j][i] = 1;  
    50 //                              cout << "i == " << i << "j == " << j << endl;   
    51                                 count++;  
    52                             }  
    53                         }  
    54                     }  
    55                 }  
    56                 ans += count;  
    57                 if (count == 0)  
    58                 {  
    59                     break;  
    60                 }  
    61             }  
    62             printf("%d
    ", ans);          
    63         }  
    64     }  
    65 //  system("pause");   
    66     return 0;  
    67 }  //来自http://blog.csdn.net/qinaide_lixiaoshuo/article/details/8945349

    再是我自己的错误的代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 using namespace std;
     5 int main()
     6 {
     7     int T,a[80000],b[80000],i,j,k,r,Q;
     8     int p[250][250],map[250][250];
     9     scanf("%d",&T);
    10     while(T--)
    11     {
    12         int m,n,g,sum=0;
    13         scanf("%d%d%d",&m,&n,&g);
    14         memset(p,0,sizeof(p));
    15         memset(map,0,sizeof(map));
    16         for(i=0;i<n; i++)
    17         {
    18             scanf("%d%d",&a[i],&b[i]);
    19             map[a[i]][b[i]]=1;
    20             map[b[i]][a[i]]=1;
    21         }
    22         Q=1;
    23         for(r=0;r<Q;r++)
    24        {
    25            r=0;
    26            Q=0;
    27         for(i=0;i<m-1;i++)
    28             for(j=1+i;j<m;j++)
    29                for(k=0;k<m;k++)
    30             if(map[i][k]==1 && map[j][k]==1 && map[i][j]==0)
    31           {
    32             p[i][j]++;
    33             p[j][i]++;
    34           }
    35         for(i=0;i<m-1;i++)
    36             for(j=i+1;j<m;j++)
    37             if(p[i][j]>=g)
    38             {
    39                sum++;
    40                p[i][j]=-100000;
    41                p[j][i]=-100000;
    42                map[i][j]=1;
    43                map[j][i]=1;
    44                Q=2;
    45             }
    46         }
    47         printf("%d
    ",sum);
    48     }
    49     return 0;
    50 }
    View Code

    J:没什么好说的额,直接暴力:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 int main()
     5 {
     6    int T,a[440],maxm,i,sum,j;
     7     scanf("%d",&T);
     8     while(T--)
     9     {
    10         maxm=0;
    11         int m,n;
    12         scanf("%d%d",&m,&n);
    13         for(i=0;i<m;i++)
    14             scanf("%d",&a[i]);
    15         for(i=m; i<2*m-1; i++)
    16             a[i]=a[i-m];
    17         for(i=0;i<m; i++)
    18          {
    19             sum=0;
    20             for(j=0;j<n;j++)
    21                 sum+=a[i+j];
    22              if(sum>maxm)
    23                  maxm=sum;
    24          }
    25         printf("%d
    ",maxm);
    26     }
    27     return 0;
    28 }

    K :题目大意是给你两个砝码,你可以把其中的一个拆成两个,使得能称出来的数字最多。

    这道题用枚举都能做出来,现在用一种简单的方法:   0MS

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<math.h>
     4 #include<string.h>
     5 using namespace std;
     6 int g(int a,int b,int c)
     7 {
     8     int i,j,k,sum=0;
     9     int w[3],r[300];
    10     memset(w,0,sizeof(w));
    11     memset(r,0,sizeof(r));
    12     r[0]=1;       //要注意这里
    13     for(i=0;i<=2;i++)
    14     {
    15         w[i]+=a;
    16         for(j=0;j<=2;j++)
    17         {
    18             w[j]+=b;
    19             for(k=0;k<=2;k++)
    20             {
    21                 w[k]+=c;
    22                 int t=fabs(w[1]-w[2]);
    23                 if(!r[t])   //标记,如果t出现过,r[t]==1;
    24                 {
    25                     r[t]=1;
    26                     sum++;
    27                 }
    28                 w[k]-=c;
    29             }
    30             w[j]-=b;
    31         }
    32         w[i]-=a;
    33     }
    34     return sum;
    35 }
    36 
    37 int f(int a,int b)
    38 {
    39     int c,sum=0;
    40     for(c=1;c<=a/2;c++)
    41         sum=max(sum,g(a-c,c,b));
    42     return sum;
    43 }
    44 int max(int a,int b)
    45 {
    46     return a>=b?a:b;
    47 }
    48 int main()
    49 {
    50     int T,a,b;
    51     scanf("%d",&T);
    52     while(T--)
    53     {
    54         scanf("%d%d",&a,&b);
    55         printf("%d
    ",max(f(a,b),f(b,a)));   //拆a,或者拆b
    56     }
    57     return 0;
    58 }

     再给出一个神代码,很短,但是耗时  40MS

     1 #include<cstdio>
     2 #include<set>
     3 #include<algorithm>
     4 
     5 short T;
     6 int x,y,a,b,c;
     7 std::set<int>set;
     8 int ans,cnt,i,j,k;
     9 
    10 inline void go()
    11 {
    12     for(a=1;a<x;++a)
    13     {
    14         set.clear();
    15         for(i=-1;i<2;++i)
    16             for(j=-1;j<2;++j)
    17                 for(k=-1;k<2;++k)
    18                     set.insert(abs(a*i+(x-a)*j+y*k));
    19         ans=std::max(ans,(int)set.size());
    20     }
    21 }
    22 
    23 int main()
    24 {
    25     scanf("%hd",&T);
    26     while(T--)
    27     {
    28         scanf("%d %d",&x,&y);
    29         ans=0;
    30         go();
    31         std::swap(x,y);
    32         go();
    33         printf("%d
    ",ans-1);
    34     }
    35     return 0;
    36 }

    表示不懂,没学过set.......Mark一下

  • 相关阅读:
    超贴心的,手把手教你写爬虫
    人生苦短我用Python,本文助你快速入门
    RocketMQ 安装
    RocketMQ 简介
    2020年工作上的最大收获——监控告警体系
    .NET Core开源任务调度平台ScheduleMaster上新了
    从源码角度分析ScheduleMaster的节点管理流程
    使用 K8s 进行作业调度实战分享
    图解 K8s 核心概念和术语
    深度剖析 Kafka Producer 的缓冲池机制【图解 + 源码分析】
  • 原文地址:https://www.cnblogs.com/riddle/p/3215346.html
Copyright © 2011-2022 走看看