Codeforces Round #292 (Div. 2)
A
题意:给出起点(0,0)以及终点(x,y),再给出步数s,这个人可以往上下左右四个方向走,问能不能恰好在s步走到终点
先求出最小步数min,然后就可以认为这个人在磨蹭时间,走回去再走回来,在min的基础上加上2的倍数都是能够恰好到达的。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int a,b,s; 9 scanf("%d %d %d",&a,&b,&s); 10 if(a<0) a=-a; 11 if(b<0) b=-b; 12 // printf("a=%d ",a); 13 14 // printf("b=%d ",b); 15 16 int k=s-a-b; 17 18 // printf("%d ",k); 19 if(a==0&&b==0) 20 { 21 if(s%2==0) 22 printf("Yes "); 23 else 24 printf("No "); 25 } 26 else 27 { 28 if(k%2==0&&k>=0) 29 printf("Yes "); 30 else 31 printf("No "); 32 } 33 }
B
题意:一个人的朋友中有n个男孩,m个女孩,他可以在第i天邀请(i从0开始算),在第i天,他可以邀请第i%n个男孩,第i%m个女孩,然后男孩中有b个开心,女孩子中有g个开心,然后邀请的两个人中只要有一个人开心,另外一个也会变开心。 问能不能使得所有的男孩女孩都开心。
模拟这个邀请的过程直到大家都开心,跳出循环。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int x[1005],y[1005]; 7 int n,m; 8 int main() 9 { 10 int i,j,b,g,u,flag=0,sum=0; 11 scanf("%d %d",&n,&m); 12 scanf("%d",&b); 13 for(i=1;i<=b;i++) 14 { 15 scanf("%d",&u); 16 x[u]=1; 17 } 18 scanf("%d",&g); 19 for(i=1;i<=g;i++) 20 { 21 scanf("%d",&u); 22 y[u]=1; 23 } 24 25 for(i=0;i<100000;i++) 26 { 27 sum=0; 28 if(x[i%n]||y[i%m]) 29 { 30 x[i%n]=1; 31 y[i%m]=1; 32 } 33 34 for( j=0;j<n;j++) 35 sum+=x[j]; 36 for(j=0;j<m;j++ ) 37 sum+=y[j]; 38 if(sum==(n+m)) 39 { 40 flag=1; 41 break; 42 } 43 44 } 45 if(flag) printf("Yes "); 46 else printf("No "); 47 }