第一次组队比赛

网站: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\n",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\n");

21             else 

22                 printf("1\n");

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\n",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\n");

18         else

19             printf("Alice\n");

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\n", 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\n",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\n",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\n",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\n",ans-1);

34     }

35     return 0;

36 }

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

你可能感兴趣的:(第一次组队比赛)