A. Little Artem and Presents
题意:Artem想将自己的n个糖果送给Masha,他想送尽量多的次数而不在乎数量,不顾每次送的数量不能和上次相同。
题解:只要第一次送一个,第二次送两个这样一次送就可以保证送的次数最多,
代码:
1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 while(scanf("%d",&n)!=EOF) 9 { 10 int ans=n/3*2; 11 int temp=n%3; 12 if(temp==1||temp==2) ans++; 13 printf("%d ",ans); 14 } 15 return 0; 16 }
B. Little Artem and Grasshopper
题意:Artem抓到了一直蚂蚱,他给蚂蚱做了一个1*n的跳跃区。现在给出蚂蚱的跳跃方式和每次的距离,问蚂蚱什么会不会跳出去。
题解:一直按照给的方式和距离模拟,同时标记处蚂蚱跳过的位置,当蚂蚱跳出去是则输出FINITE,当蚂蚱跳到他之前跳过的位置时,则它会按照之前的路径一直重复,就输出INFINITE。
代码:
1 /*B*/ 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 const int maxn=100000+10; 7 8 int main() 9 { 10 int n; 11 char s[maxn]; 12 int d[maxn],vis[maxn]; 13 while(scanf("%d",&n)!=EOF) 14 { 15 memset(s,0,sizeof(s)); 16 memset(d,0,sizeof(d)); 17 memset(vis,0,sizeof(vis)); 18 scanf("%s",s); 19 for(int i=0;i<n;i++) 20 scanf("%d",&d[i]); 21 int flag=0; 22 int p=0; 23 while(1) 24 { 25 if(vis[p]==0) 26 vis[p]=1; 27 else 28 { 29 flag=-1; 30 break; 31 } 32 if(s[p]=='>') 33 p+=d[p]; 34 else 35 p-=d[p]; 36 if(p<0||p>=n) 37 { 38 flag=1; 39 break; 40 } 41 } 42 if(flag==1) 43 printf("FINITE "); 44 else 45 printf("INFINITE "); 46 } 47 return 0; 48 }
C. Little Artem and Matrix
题意:Artem买了一个电子元件,它可以储存一个n*m的数组。每一行每一列都可以接受信号,当收到信号时,这一行是每个元素就会依次向左移动,左边第一个移动到最后一个;这一列就会依次向上移动,上面第一个的移动到最下面。Artem对这个元件操作了q次,每次操作是对某一行(1)或一列(2)发送信号或者是检查(3)某个位置的值是多少。不过在操作完之后,Artem把结果丢了。现在要找到一个初始的数组,它可以满足操作的结果。
题解:先定义一个元素全部为0的数组,然后把q次操作记录下来,然后从最后一次操作来逆推满足的数组。如果操作类型是3,那么我们就标记这个位置为检查到的值。如果类型是1,那么就把这一行右移,2则下移。这样我们就可以找到满足条件的数组啦。
代码:
1 /*C*/ 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 const int maxn=105; 7 struct data{ 8 int type; 9 int r;int c; 10 int x;int y;int p; 11 }; 12 13 void show(int ma[105][105],int n,int m) 14 { 15 16 } 17 18 int main() 19 { 20 int n,m,q; 21 while(scanf("%d%d%d",&n,&m,&q)!=EOF) 22 { 23 int ma[105][105]; 24 memset(ma,0,sizeof(ma)); 25 struct data turn[10000+10]; 26 for(int i=0;i<q;i++) 27 { 28 scanf("%d",&turn[i].type); 29 if(turn[i].type==1) 30 scanf("%d",&turn[i].r); 31 else if(turn[i].type==2) 32 scanf("%d",&turn[i].c); 33 else 34 scanf("%d%d%d",&turn[i].x,&turn[i].y,&turn[i].p); 35 } 36 for(int k=q-1;k>=0;k--) 37 { 38 if(turn[k].type==3) 39 ma[turn[k].x][turn[k].y]=turn[k].p; 40 else if(turn[k].type==1) 41 { 42 int i=turn[k].r; 43 ma[i][0]=ma[i][m]; 44 for(int j=m;j>=1;j--) 45 ma[i][j]=ma[i][j-1]; 46 } 47 else 48 { 49 int j=turn[k].c; 50 ma[0][j]=ma[n][j]; 51 for(int i=n;i>=1;i--) 52 ma[i][j]=ma[i-1][j]; 53 } 54 } 55 for(int i=1;i<=n;i++) 56 { 57 printf("%d",ma[i][1]); 58 for(int j=2;j<=m;j++) 59 printf(" %d",ma[i][j]); 60 printf(" "); 61 } 62 } 63 return 0; 64 }
D. Little Artem and Dance
题意:有n个男生,n个女生一起跳舞一男一女是一对(n为偶数),依次排列围成一个圈。现在给出q个操作,有两种类型,1表示男生移动,例如:有四对,1号男生和1号女生一起跳舞,2号男生和2号女生。。。当移动1时,变成4号男生和1号女生一起跳舞,1号男生和2号女生。。。当移动为负数时则是逆时针移动。2表示奇数位的女生和偶数位的女生交换舞伴。求q次操作后1号至n号女生的舞伴编号。
题解:根据编号的奇偶把男生分为两组,不管如何操作,每组男生的相对次序是不会变的,只是开头的1号和2号的位置不同而已,所以我们只需要模拟操作,记录下1号和2号的位置,我们就可以确定所以人的位置啦。
代码:
1 /*D*/ 2 #include<cstdio> 3 using namespace std; 4 5 const int maxn=1000000+10; 6 int ans[maxn]; 7 int n,q; 8 9 int change(int s) 10 { 11 if(s<=0) 12 { 13 while(1) 14 { 15 s+=n; 16 if(s>0) break; 17 } 18 } 19 if(s%n==0) 20 return n; 21 else 22 return s%n; 23 } 24 25 int main() 26 { 27 28 while(scanf("%d%d",&n,&q)!=EOF) 29 { 30 int one=1,two=2; 31 for(int i=0;i<q;i++) 32 { 33 int t; 34 scanf("%d",&t); 35 if(t==1) 36 { 37 int d; 38 scanf("%d",&d); 39 one+=d;two+=d; 40 one=change(one); 41 two=change(two); 42 } 43 else 44 { 45 if(one&1) 46 one++; 47 else 48 one--; 49 if(two&1) 50 two++; 51 else 52 two--; 53 } 54 } 55 56 int time=n/2; 57 int p=1; 58 for(int i=1;i<=time;i++) 59 { 60 ans[one]=p; 61 one+=2; 62 one=change(one); 63 p+=2; 64 } 65 p=2; 66 for(int i=1;i<=time;i++) 67 { 68 ans[two]=p; 69 two+=2; 70 two=change(two); 71 p+=2; 72 } 73 printf("%d",ans[1]); 74 for(int i=2;i<=n;i++) 75 printf(" %d",ans[i]); 76 printf(" "); 77 } 78 return 0; 79 }