Codeforces Round #348

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

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

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

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  } 
View Code
原文地址:https://www.cnblogs.com/yepiaoling/p/5459928.html