Codeforces Round #279 (Div. 2)

来源:互联网 发布:mac os x 10.11.5 cdr 编辑:程序博客网 时间:2024/06/07 16:57
A
#include<cstdio>using namespace std;const int N=5000;int a[N],b[N],c[N];int n,na,nb,nc;int min(int a,int b){    if(a<b)        return a;    return b;}int main(){    int i,d,ans;    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        na=0;nb=0;nc=0;        for(i=1;i<=n;i++)        {            scanf("%d",&d);            if(d==1)                a[na++]=i;            else if(d==2)                b[nb++]=i;            else if(d==3)                c[nc++]=i;        }        ans=min(na,min(nb,nc));        printf("%d\n",ans);        for(i=0;i<ans;i++)            printf("%d %d %d\n",a[i],b[i],c[i]);    }    return 0;}

B

建立前向表和后向表,n为偶数是正序填写第1,3,5....位数,逆序填写第n-2,n-4...0位数,n为奇数时正序填写第1,3,5....位数,然后找到位于0为的同学编号依次填写0,2,4...位数。

#include<cstdio>#include<cstring>using namespace std;const int N=1000005;int fir[N],las[N],f,l,n;int ans[200005],p[N];int main(){    int a,b,i,fl;    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        memset(fir,-1,sizeof(fir));        memset(las,-1,sizeof(las));        memset(p,-1,sizeof(p));        for(i=0;i<n;i++)        {            scanf("%d%d",&a,&b);            p[a]=1;            p[b]=1;            fir[a]=b;            las[b]=a;            if(a==0)                f=b;            if(b==0)                l=a;        }        if(n%2==0)        {            //printf("f=%d l=%d\n",f,l);            for(i=1;i<n;i+=2)            {                ans[i]=f;                f=fir[f];            }            for(i=n-2;i>=0;i-=2)            {                ans[i]=l;                l=las[l];            }            for(i=0;i<n;i++)            {                if(i==0)                    printf("%d",ans[i]);                else                    printf(" %d",ans[i]);            }            printf("\n");        }        else if(n%2==1)        {            for(i=1;i<n;i+=2)            {                ans[i]=f;                p[f]=-1;                f=fir[f];            }            for(i=1;i<N;i++)                if(p[i]!=-1)                {                    l=i;                    break;                }            while(las[l]!=-1)                l=las[l];            for(i=0;i<n;i+=2)            {                ans[i]=l;                l=fir[l];            }            for(i=0;i<n;i++)            {                if(i==0)                    printf("%d",ans[i]);                else                    printf(" %d",ans[i]);            }            printf("\n");        }    }    return 0;}
c

ma表示正向前i位数组成的数mod a 后的余数

mp表示1,10,100,1000,10000......mod b后的余数

mb表示倒数i位数字mod b 后的余数

mb[i]=mb[i+1]+(s[i]-'0')*10^x   x为从第i位到最后一位字符组成的数的位数

#include<cstdio>#include<cstring>using namespace std;const int N=1000005;char s[N];int a,b,len;int ma[N],mb[N],mp[N];void init(){    int i,p=1;    for(i=0;i<len;i++)    {        p=p%b;        mp[i]=p;        p*=10;    }    p=0;    for(i=0;i<len;i++)    {        p=p*10+s[i]-'0';        p=p%a;        ma[i]=p;    }    p=0;    for(i=len-1;i>=0;i--)    {        p=(s[i]-'0')*mp[len-i-1]+p;        p=p%b;        mb[i]=p;    }}int main(){    int i,j;    //freopen("in.txt","r",stdin);    while(scanf("%s",s)!=EOF)    {        len=strlen(s);        scanf("%d%d",&a,&b);        init();        //for(i=0;i<len;i++) printf("%d ",ma[i]);printf("\n");        //for(i=0;i<len;i++) printf("%d ",mp[i]);printf("\n");        //for(i=0;i<len;i++) printf("%d ",mb[i]);printf("\n");        for(i=1;i<len;i++)            if(ma[i-1]==0&&mb[i]==0)                break;        while(s[i]=='0')            i++;        if(i==len)        {            printf("NO\n");        }        else        {            printf("YES\n");            //printf("i=%d\n",i);            for(j=0;j<i;j++)                printf("%c",s[j]);            printf("\n");            for(j=i;j<len;j++)                printf("%c",s[j]);            printf("\n");        }    }    return 0;}

D

输入a,b,c,d;

统计第一组数和第二组数的因子中有多少2,3

除2,转换成2的因子数减一

乘2/3转换成3的因子减一,2的因子数加一

#include<cstdio>using namespace std;int abs(int a){    if(a>0)        return a;    return -a;}int main(){    int a,b,c,d,d1,d2,d3,d4,t1,t2,ans;    long long ra,rb;    //freopen("in.txt","r",stdin);    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)    {        ra=(long long)a*(long long)b;        rb=(long long)c*(long long)d;        d1=d2=d3=d4=0;        while(ra%2==0)        {            d1++;            ra/=2;        }        while(ra%3==0)        {            d2++;            ra/=3;        }        while(rb%2==0)        {            d3++;            rb/=2;        }        while(rb%3==0)        {            d4++;            rb/=3;        }        if(ra!=rb)        {            printf("-1\n");            continue;        }        ans=abs(d2-d4);        ans+=abs(d1+(d2-d4)-d3);        printf("%d\n",ans);        t1=abs(d2-d4);        if(d2>d4)        {            d1+=t1;            while(t1!=0&&a%3==0)            {                a=a/3*2;                t1--;            }            if(t1>0)            {                while(t1 !=0&&b%3==0)                {                    t1--;                    b=b/3*2;                }            }        }        else if(d4>d2)        {            d3+=t1;            while(t1!=0&&c%3==0)            {                c=c/3*2;                t1--;            }            if(t1>0)            {                while(t1!=0&&d%3==0)                {                    t1--;                    d=d/3*2;                }            }        }        if(d1>d3)        {            t2=d1-d3;            while(t2!=0&&a%2==0)            {                a/=2;                t2--;            }            if(t2>0)            {                while(t2!=0&&b%2==0)                {                    t2--;                    b/=2;                }            }        }        else if(d3>d1)        {            t2=d3-d1;            while(t2!=0&&c%2==0)            {                c/=2;                t2--;            }            if(t2>0)            {                while(t2!=0&&d%2==0)                {                    t2--;                    d/=2;                }            }        }        printf("%d %d\n",a,b);        printf("%d %d\n",c,d);    }    return 0;}




0 0