第一次组队训练

题目链接:http://www.bnuoj.com/bnuoj/contest_show.php?cid=2009#problem/0

A.........水题,在学校学C的时候就做过的..............

代码如下:

 1 #include <stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,a,i,j=0;
 7     while(scanf ("%d",&n)!=EOF)
 8     {
 9         j=0;
10         if(n==0) break;
11     for (i=1;;i++)
12     {
13         a=n/3;
14         n=n-2*a;
15         j=j+a;
16         if(n<=2)
17         {
18             if (n==2)
19                 j++;
20             break;
21         }
22     }
23     printf ("%d\n",j);
24     }
25     return 0;
26 }
View Code

B.

//注意跳出是用EOF(Ctrl+6+z);

代码如下:

 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         {
16             n=a+b;
17         }
18         else
19         {
20             n=a-b;
21         }
22         if(n<0&&c[0]=='?')
23             s++;
24         else
25         {
26             x=strlen(c);
27             if(x==1&&n==(c[0]-'0')&&n>=0&&n<10)
28             {
29             s++;
30             }
31             else if(x==2&&n>9&&n<100&&(n%10==c[1]-'0')&&(n/10==c[0]-'0'))
32                 s++;
33             else if(n>99&&x==3&&(n%10==c[2]-'0')&&((n/10)%10==c[1]-'0')&&(n/100==c[0]-'0'))
34                 s++;
35         }
36             if(i==100)
37                 break;
38         }
39         printf("%d\n",s);
40         return 0;
41 }
View Code

C.

代码如下:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 using namespace std;
 5 int main()
 6 {
 7     char a[1000];
 8     int b[1000],i,j,n,x;
 9     while(scanf("%s",a) && a[0]!='0')
10     {
11         n=0;
12         x=strlen(a);
13         for(i=0;i<x;i++)
14             b[i]=a[i]-'0';
15         for(i=0;i<x-1;i++)
16         {
17             n=n*10+b[i];
18             n%=17;
19         }
20         n=(n-b[x-1]*5)%17;
21         if(n) printf("0\n");
22         else printf("1\n");
23     }
24     return 0;
25 }
View Code

D.

//搜索+强剪枝

//代码来自http://blog.csdn.net/andring/article/details/7376129

代码如下:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 using namespace std;
  5 #define FRE freopen("a.txt","r",stdin);
  6 struct node
  7 {
  8     int x,y;
  9 }queue[1000];
 10 int n,m;
 11 int Max,flag,tatal;
 12 char map[20][20];
 13 char ans[35],stack[35];
 14 int dir[4][2]={-1,0,0,-1,0,1,1,0};
 15 bool yes(int x,int y)
 16 {
 17     return x>=0&&x<n&&y>=0&&y<m;
 18 }
 19 int bfs(int x,int y)
 20 {
 21     node t;
 22     char g[20][20];
 23     for(int i=0;i<n;i++)strcpy(g[i],map[i]);
 24     int head,tail;
 25     head=tail=0;
 26     t.x=x,t.y=y;
 27     queue[tail++]=t;
 28     while(head<tail)
 29     {
 30         x=queue[head].x;
 31         y=queue[head++].y;
 32         for(int i=0;i<4;i++)
 33         {
 34             int xx=x+dir[i][0];
 35             int yy=y+dir[i][1];
 36             if(!yes(xx,yy)||g[xx][yy]=='#')continue;
 37             g[xx][yy]='#';
 38             t.x=xx,t.y=yy;
 39             queue[tail++]=t;
 40         }
 41     }
 42     return head;
 43 }
 44 void dfs(int x,int y,int cnt)
 45 {
 46     if(Max<cnt||(Max==cnt&&flag==1))
 47     {
 48         stack[cnt]=0;
 49         strcpy(ans,stack);
 50         Max=cnt;
 51         flag=0;
 52     }
 53     int res=bfs(x,y);
 54     if(res+cnt-1<Max||(res+cnt-1==Max&&flag==-1))return;
 55     for(int i=0;i<4;i++)
 56     {
 57         int xx=x+dir[i][0];
 58         int yy=y+dir[i][1];
 59         if(!yes(xx,yy)||map[xx][yy]=='#')continue;
 60         if(flag!=1&&ans[cnt]>map[xx][yy]&&tatal==Max)continue;
 61         stack[cnt]=map[xx][yy];
 62         map[xx][yy]='#';
 63         if(flag==0)
 64         {
 65             if(cnt>=Max)flag=1;
 66             else if(ans[cnt]==stack[cnt])flag=0;
 67             else if(ans[cnt]<stack[cnt])flag=1;
 68             else flag=-1;
 69             dfs(xx,yy,cnt+1);
 70             flag=0;
 71         }
 72         else dfs(xx,yy,cnt+1);
 73         map[xx][yy]=stack[cnt];
 74     }
 75 }
 76 int main()
 77 {
 78     //FRE;
 79     while(scanf("%d%d",&n,&m)&&n+m)
 80     {
 81         tatal=0;
 82         for(int i=0;i<n;i++)
 83         {
 84             scanf("%s",map+i);
 85             for(int j=0;j<m;j++)
 86             {
 87                 if(map[i][j]!='#')tatal++;
 88             }
 89         }
 90         Max=1;
 91         memset(ans,0,sizeof(ans));
 92         for(int i=0;i<n;i++)
 93         {
 94             for(int j=0;j<m;j++)
 95             {
 96                 if(map[i][j]=='#')continue;
 97                 if(Max==tatal&&ans[0]>map[i][j])continue;
 98                 stack[0]=map[i][j];
 99                 map[i][j]='#';
100                 if(ans[0]==stack[0])flag=0;
101                 else if(ans[0]<stack[0])flag=1;
102                 else flag=-1;
103                 dfs(i,j,1);
104                 map[i][j]=stack[0];
105             }
106         }
107         printf("%s\n",ans);
108     }
109     return 0;
110 }
View Code

E.

水题...........= =.......不解释........

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     char a[4],t;
 9     scanf("%d",&t);
10     while(t--)
11     {
12         scanf("%s",a);
13         int x,i,n=0;
14         x=strlen(a);
15         if(x==5) printf("3\n");
16         else
17         {
18             for(i=0;i<x;i++)
19             {
20                 if(a[i]=='o') n++;
21                 if(a[i]=='n') n++;
22                 if(a[i]=='e') n++;
23             }
24             if(n>=2) printf("1\n");
25             else printf("2\n");
26         }
27     }
28     return 0;
29 }
View Code

F.

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 bool aa[1000000];
 4 bool solve(int n)
 5 {
 6     if(n%7==0)  return true;
 7     int t=n;
 8     while(t)
 9     {
10         if(t%10==7)  return true;
11         t/=10;
12     }
13     return false;
14 }
15 
16 void calc()
17 {
18     for(int i=1;i<1000000;i++)
19     {
20         if(solve(i))  aa[i]=true;
21         else  aa[i]=false;
22     }
23 
24 }
25 int main()
26 {
27     int n,m,k;
28     int t;
29     int cnt;
30     calc();
31     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
32     {
33         if(n==0 && m==0 && k==0) break;
34         t=m;
35         cnt=0;
36      for(;;)
37         {
38             if(aa[t])cnt++;
39             if(cnt==k)
40             {
41                 printf("%d\n",t);
42                 break;
43             }
44             if(n==m)
45             {
46                 t+=2*(m-1);
47                 continue;
48             }
49             if(m==1)
50             {
51                 t+=2*(n-m);
52                 continue;
53             }
54             t+=2*(n-m);
55             if(aa[t])cnt++;
56             if(cnt==k)
57             {
58                 printf("%d\n",t);
59                 break;
60             }
61 
62             t+=2*(m-1);
63         }
64     }
65     return 0;
66 }
View Code

G.

在学校做过类似的题目,但那个题目是一个盒子的。此题对于Bob的胜利可以找出规律........

Bob胜利时,最初的球的个数(多的那一边)为:3,7,15,31,63,........等于前一个球的个数乘以2加1;

代码如下:

 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 }
View Code

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 }
View Code

//代码来自于:http://blog.csdn.net/qinaide_lixiaoshuo/article/details/8945349

J.

暴力......

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int t;
 9     scanf("%d",&t);
10     while(t--)
11     {
12         int N,M,a[410],maxx,sum,i,j;
13         scanf("%d%d",&N,&M);
14         memset(a,0,sizeof(a));
15         for(i=0;i<N;i++)
16             scanf("%d",&a[i]);
17         for(i=N;i<2*N-1;i++)
18             a[i]=a[i-N];
19         for(i=0,maxx=0;i<N;i++)
20         {
21             for(j=i,sum=0;j<i+M;j++)
22             sum+=a[j];
23             if(sum>maxx) maxx=sum;
24         }
25         printf("%d\n",maxx);
26     }
27     return 0;
28 }
View Code

K.

 ..............还木有看

posted @ 2013-07-27 10:29  Teilwall  阅读(185)  评论(0编辑  收藏  举报