第一次组队比赛

网站: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一下

原文地址:https://www.cnblogs.com/riddle/p/3215346.html