第一次组队训练
题目链接: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 }
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 }
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 }
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 }
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 }
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 }
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 }
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
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 }
K.
..............还木有看