cf_292 Div.2

来源:互联网 发布:dnf打团网络冲突 编辑:程序博客网 时间:2024/06/09 16:51

源地址:http://codeforces.com/contest/515

A:输入三个数a,b,n.问能否用n步从(0,0)点走到(a,b)点,移动方向为上下左右。

很明显,先求出到a,b至少移动几步,如果用n步都不能到达(a,b),那么显然不能。。如果n大于等于走到(a,b)的最小步数且(n-最小步数)为偶数时(即可以反复在用一个地方走动)时能够到达。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 100010ll Abs(ll x){    return x>0?x:-x;}int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    ll a,b,s;    while(scanf("%I64d%I64d%I64d",&a,&b,&s)!=EOF){        ll dif = Abs(a)+Abs(b);        s -= dif;        if(s>=0 && (s%2==0)){            printf("Yes\n");        }else            printf("No\n");    }return 0;}
B:题意就是有n个男孩和m个女孩,n个男孩中状态好的被标志为1,状态不好的为0,女孩亦如此。从头开始,每一天选择一对男女孩,即在i<min(n,m)时这对男女孩为第i个男孩和第i个女孩配对,如果其中有一个状态好的,那么两个人状态都会变好,即都会变为1。当i>min(n,m)时,那么选择完的那一方将会从头重新开始按顺序选择,即(i+1)%n和(i+1)%m进行配对。问最后能否使得所有人的状态都变好。

模拟题,我们发现每当配对至lcm(n,m)次时,那么男孩和女孩的配对方式会和刚开始的一样,等于循环了一遍。所以我们只要进行lcm(n,m)次配对就可以了,再对每个人状态检查一遍即可。刚开始我没细想,直接将每次配对都循环1000010次,这样得出结果也是一样的,因为n,m都比较小。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 1000010int by[N];int gr[N];int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    while(sfd(n,m)!=EOF){        MEM1(by);        MEM1(gr);        int x,y,tmp;        sf(x);        for(int i=0;i<x;i++){            sf(tmp);            by[tmp] = 1;        }        sf(y);        for(int i=0;i<y;i++){            sf(tmp);            gr[tmp] = 1;        }        int p1=0,p2=0;        int ct=0;        while(ct<M){            by[p1] = gr[p2] = (by[p1]|gr[p2]);            p1 = (p1+1)%n;            p2 = (p2+1)%m;            ct++;        }        int flag=1;        for(int i=0;i<n;i++)            if(!by[i])                flag=0;        for(int i=0;i<m;i++)            if(!gr[i])                flag=0;        if(flag)            printf("Yes\n");        else            printf("No\n");    }return 0;}
C:给你一个x,求找到一个不含0,1数字的a,使得函数F(x)=F(a)

F(1234)=1!*2!*3!*4!

这道题目我的方法比较笨,就是把数字拿来分解,对于x中的每一个数字,如果它是素数,那么就把它写到a中的某一位,如果是合数,那么就把它进行分解,分解为多个素数的乘积,最后输出。

但是其实一共就10个数字,我们把每个数字的分解形式找出来就行,比如F(1234)=F(33222),我们可以看出,这里的4!被分解为3!2!2!,同理9!可以被分为7!2!3!3!

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 1000010char ch[20];int ct[15];int prm[20];int res[110];int k;void Init(){    k=0;    prm[k++] = 2;    prm[k++] = 3;    prm[k++] = 5;    prm[k++] = 7;}bool check(int x){    if(x==2||x==3||x==5||x==7)        return true;    return false;}int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    ll x;    Init();    while(sf(n)!=EOF){            sfI(x);            sprintf(ch,"%I64d",x);            int len = strlen(ch);            memset(ct,0,sizeof ct);            for(int i=0;i<len;i++){                for(int j=ch[i]-'0';j>=2;j--){                    ct[j]++;                }            }            int p=0;            for(int i=9;i>1;i--){                if(ct[i]&&check(i)){                    for(int j=0;j<ct[i];j++){                        res[p++] = i;                        for(int s=i-1;s>1;s--)                            ct[s]--;                    }                }                else if(ct[i]&&!check(i)){                    int tmp=i;                    for(int j=0;j<k;j++){                        if(tmp%prm[j]==0){                            while(tmp%prm[j]==0){                                tmp /= prm[j];                                ct[prm[j]] += ct[i];                            }                        }                    }                }            }            for(int i=0;i<p;i++)                printf("%d",res[i]);            printf("\n");    }return 0;}

简单解法:

string a[10] = {"", "", "2", "3", "223", "5", "35", "7", "2227", "7233"};<span style="white-space:pre"></span>//0-10的分解方法int main(){    int n;    string s, ans;    cin >> n >> s;    for(int i = 0; i < n; ++i) ans += a[s[i]-'0'];    sort(ans.begin(), ans.end());    reverse(ans.begin(), ans.end());    cout << ans << endl;    return 0;}
D:题意就是给你一个n*m的地图,有‘.’和‘*’两种图案,其中'.'的地方是可以放东西的,题目给的是1*2大小的东西,问是否存在且只有一种方法使得1*2的东西能够刚好把这地图填满(即没有'.')。

刚开始用了dfs,,直接超时了。。--

后来参考了下别人,用的是bfs,其实思路相当清晰。

对于一个只有一种方法的地图来说,肯定有个地方是只能放<>或者^v的,要不然如果所有地方都能够放置两种方法,那总的肯定也不至一种。

当我们每找到一个这种只能放一种图案的空地时(我们姑且称它为符合条件的空地),我们就将它入队,然后当每个这种空地出队时,我们把它和它旁边仅有的那块空地组成一个唯一的图案,再在那块“旁边的空地”上向四周找寻符合条件的空地(因为它四周的空地因为少了它以后,就很有可能会成为一块符合条件的空地),如果有符合条件的,就入队,直到队列为空。

最后我们在地图中寻找是否还残留有'.'的地方,如果有,那么说明该地图不能被1*2的东西填满。反之则反。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))#define Pr(x,y) make_pair(x,y)const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 100010char ch[2010][2010];char tmp[2010][2010];char s[5] = "<^>v";<span style="white-space:pre"></span>//这个的顺序要和dirx和diry的相对应int dirx[4] = {0,1,0,-1};int diry[4] = {1,0,-1,0};bool check(int x,int y){    if(x>=0&&x<n&&y>=0&&y<m&&ch[x][y] == '.')        return true;    return false;}int getNum(int x,int y){<span style="white-space:pre"></span>//判断x,y是否为符合条件的空地    int res=0;    for(int i=0;i<4;i++){        int nx = x+dirx[i];        int ny = y+diry[i];        if(check(nx,ny))             res++;    }    return res;}queue<pair<int,int> >q;int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    while(sfd(n,m)!=EOF){        for(int i=0;i<n;i++)            sfs(ch[i]);        while(!q.empty())            q.pop();        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                if(check(i,j)&&getNum(i,j)==1)                    q.push(Pr(i,j));            }        }        while(!q.empty()){            int tmpx = q.front().first;            int tmpy = q.front().second;            q.pop();            for(int i=0;i<4;i++){                int nx = tmpx+dirx[i];                int ny = tmpy+diry[i];                if(check(nx,ny)){                    ch[tmpx][tmpy] = s[i];                    ch[nx][ny] = s[i^2];  //0&2 2&0 1&3 3&1                    for(int j=0;j<4;j++){                        int nxx = nx+dirx[j];                        int nyy = ny+diry[j];                        if(check(nxx,nyy)&&getNum(nxx,nyy)==1){                            q.push(Pr(nxx,nyy));                        }                    }                }            }         }            int flag = 1;            for(int i=0;i<n;i++)                for(int j=0;j<m;j++){                    if(ch[i][j] == '.')                        flag = 0;                }            if(!flag)                printf("Not unique\n");            else{                for(int i=0;i<n;i++)                    printf("%s\n",ch[i]);            }    }return 0;}





0 0
原创粉丝点击