Codeforces Round #190 (Div. 2前三题)

来源:互联网 发布:js数组复制copy 编辑:程序博客网 时间:2024/06/05 15:44

A. Ciel and Robot


答案不唯一,按规律直接输出就可以了。

#include<cstdio>#include<cstring>#include<vector>using namespace std;int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        if(n<=m)        {            printf("%d\n",m+n-1);            for(int i=1;i<=m;i++)            {                printf("1 %d\n",i);            }            for(int i=2;i<=n;i++)            {                printf("%d 1\n",i);            }        }        else        {            printf("%d\n",n+m-1);            for(int i=1;i<=n;i++)            {                printf("%d 1\n",i);            }            for(int i=2;i<=m;i++)            {                printf("1 %d\n",i);            }        }    }    return 0;}

B. Ciel and Flowers

WA了很多次啊。 先111的取,再3个3个取,或者调换顺序,再或者求他们两个的最大值的贪心方法都是错的!

后来的做法是,大于3的时候就3个3个取,取完之后dfs直接列出所有情况。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int tot;int maxn;void dfs(int r,int g,int b,int now){    if(now>maxn) maxn=now;    if(r-3>=0) dfs(r-3,g,b,now+1);    if(g-3>=0) dfs(r,g-3,b,now+1);    if(b-3>=0) dfs(r,g,b-3,now+1);    if(r>=1&&g>=1&&b>=1) dfs(r-1,g-1,b-1,now+1);}int main(){    int r,g,b;    while(scanf("%d%d%d",&r,&g,&b)!=EOF)    {        maxn=0;        tot=0;       if(r>3)       {           tot+=(r-3)/3;           r=((r-3)%3)+3;       }       if(g>3)       {           tot+=(g-3)/3;           g=((g-3)%3)+3;       }       if(b>3)       {           tot+=(b-3)/3;           b=((b-3)%3)+3;       }       dfs(r,g,b,0);       printf("%d\n",tot+maxn);    }    return 0;}

C. Ciel and Robot

首先求出一遍循环的终点,得到的x,y就是对于每一个点,每次循环的偏移量px,py。

然后对于第一次循环里到达的每一个点,计算 x + k * px == a && y+ k * py == b是否成立

注意几个trick  

1、k必须为整数(不要用取余判断整数,会RE)

2、判断方向,这个可以加一个距离判断,如果 (x+px,y+py) 和(a,b)的距离 比 (x,y)和(a,b)的距离还要大,就可以直接不用考虑了。


#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;int dx[]={0,0,-1,1};int dy[]={1,-1,0,0};int map[300][300];vector<int> vx;vector<int> vy;int a,b;int cal (int x,int y){    return abs(a-x)+abs(b-y);}int main(){    char str[200];    while(scanf("%d%d",&a,&b)!=EOF)    {        int flag=0;        if(a==0&&b==0) flag=1;        scanf("%s",str);        int x=0,y=0;        int px=0,py=0;        for(int i=0;str[i];i++)        {            switch(str[i])            {                case 'U':y=y+1;vx.push_back(x);vy.push_back(y);if(x==a&&y==b) flag=1;break;                case 'D':y=y-1;vx.push_back(x);vy.push_back(y);if(x==a&&y==b) flag=1;break;                case 'L':x=x-1;vx.push_back(x);vy.push_back(y);if(x==a&&y==b) flag=1;break;                case 'R':x=x+1;vx.push_back(x);vy.push_back(y);if(x==a&&y==b) flag=1;break;            }        }        px=x;        py=y;        if(flag) {printf("Yes\n");continue;}        if(px==0&&py==0) {printf("No\n");continue;}        int t=0;        for(int i=0;i<vx.size();i++)        {            if(cal(vx[i]+px,vy[i]+py)>cal(vx[i],vy[i]) ) continue;            int t;            if(px!=0)            {                t=(a-vx[i])/px;                if(t*px!=(a-vx[i])) continue;                if(t*py+vy[i]==b)                {                    flag=1;                    break;                }            }            else            {                t=(b-vy[i])/py;                if(t*py!=(b-vy[i])) continue;                if(t*px+vx[i]==a)                {                     flag=1;                     break;                }            }        }        if(flag) printf("Yes\n");        else printf("No\n");    }    return 0;}



原创粉丝点击