• 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
  • 相关阅读:
    两数交换不借助第三变量
    linux磁盘文件系统管理
    Fedora15设置开机进入终端模式
    快速构建Windows 8风格应用8贴靠视图
    快速构建Windows 8风格应用6GridView数据控件
    快速构建Windows 8风格应用4FlipView数据控件
    快速构建Windows 8风格应用9竖直视图
    快速构建Windows 8风格应用1开发工具安装及模拟器使用
    快速构建Windows 8风格应用5ListView数据控件
    快速构建Windows 8风格应用2创建调试应用
  • 原文地址:https://www.cnblogs.com/yepiaoling/p/5459928.html
Copyright © 2020-2023  润新知