Codeforces Round #231 (Div. 2)A-D

来源:互联网 发布:淘宝商城布艺沙发 编辑:程序博客网 时间:2024/03/28 18:38

A题:

不解释,注意任意一个位置的数必须大于等于1

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define LL __int64using namespace std;int main(){    int i,l1,l2;    char str[100001];    while(~scanf("%s",str))    {        int len=strlen(str);        for(i=0;i<len;i++)        {            if(str[i]=='+')l1=i;            if(str[i]=='=')l2=i;        }        int a=l1;        int b=l2-l1-1;        int c=len-l2-1;        if(a+b==c)        {            cout<<str<<endl;        }        else if((a+b+2==c)||(a+b==c+2))        {            if(a+b+2==c)            {                a++;                c--;            }            else if(a+b==c+2)            {                if(a<b)b--;                else a--;                c++;            }            for(i=0;i<a;i++)cout<<"|";            cout<<"+";            for(i=0;i<b;i++)cout<<"|";            cout<<"=";            for(i=0;i<c;i++)            {                cout<<"|";            }            cout<<endl;        }        else        {            cout<<"Impossible"<<endl;        }    }    return 0;}

B题:

枚举最后一位,然后根据最后一位推出前面的数。

注意,当推出第一位的时候,一定要判断此时的余数,要不然就sad了。。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define LL __int64using namespace std;int a[1100000];int b[1100000];int c[1100000];int main(){  //  freopen("data.in","r",stdin);   // freopen("data.out","w",stdout);    int i,l1,l2,h,j,n,x,ii;    int f;    char str[100001];    int leap=0;    while(~scanf("%d%d",&n,&x))    {        leap=0;        for(ii=1;ii<=9;ii++)        {            a[1]=ii;            b[1]=ii;            f=0;            for(j=2;j<=n+1;j++)            {                b[j-1]=((a[j-1]*x)%10+f);                f=0;                if(b[j-1]>9)                {                    f++;                    b[j-1]=(b[j-1])%10;                }                a[j]=b[j-1];                f+=(a[j-1]*x)/10;            }            if(b[n]==a[1]&&a[n]!=0&&f==0)            {                if(leap==0)                {                    for(i=1;i<=n;i++)                    {                        c[i]=a[i];                    }                    leap++;                }                else                {                    leap++;                    int ll=0;                    for(i=n;i>=1;i--)                    {                        if(ll==1)c[i]=a[i];                        else                        {                            if(c[i]==a[i])c[i]=a[i];                            else if(c[i]<a[i])break;                            else if(c[i]>a[i])                            {                                ll=1;                                c[i]=a[i];                            }                        }                    }                }            }        }        if(leap==0)        {            cout<<"Impossible"<<endl;        }        else        {            for(i=n;i>=1;i--)            {                printf("%d",c[i]);            }            cout<<endl;        }    }    return 0;}
C题:贪心

在放置牌的时候,两行一起放。

优先放01,然后下面放10,如果没有就放00,如果再没有就放11.

没有01的时候,优先放00,下面放11,没有11放00.

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define LL __int64using namespace std;int a[1001];int maps[1001][1001];int main(){    int i,l1,l2,h,j,n,x,ii,m;    int f;    char str[100001];    int leap=0;    while(~scanf("%d%d",&n,&m))    {        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                scanf("%d",&x);                if(x==10)x=1;                a[x]++;            }        }        for(i=2;i<=n;i+=2)        {            for(j=1;j<=m;j++)            {                if(a[1]!=0)                {                    maps[i-1][j]=1;                    a[1]--;                    if(a[1])maps[i][j]=10,a[1]--;                    else if(a[0])maps[i][j]=0,a[0]--;                    else maps[i][j]=11,a[11]--;                }                else if(a[11]!=0)                {                    maps[i][j]=11;                    a[11]--;                    if(a[0])a[0]--,maps[i-1][j]=0;                    else a[11]--,maps[i-1][j]=11;                }                else if(a[0]!=0)                {                    maps[i][j]=0;                    maps[i-1][j]=0;                }            }        }        if(n%2)        {            for(j=1;j<=m;j++)            {                if(a[1])a[1]--,maps[n][j]=1;                else if(a[0])a[0]--,maps[n][j]=0;                else a[11]--,maps[n][j]=11;            }        }        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                printf("%02d ",maps[i][j]);            }            cout<<endl;        }    }    return 0;}


D题:

水题,当时竟然没看,SAD了。。。

我们可以枚举第一位的值。

然后三分倍数x。

由题意可以轻而易举的读出,随着x的增大,最终的结果是先减小后增大的。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define INF 99999999using namespace std;int a[1000001];int n;int dos(int st,int x){    int mx=0;    for(int i=0;i<n;i++)    {        mx=max(mx,abs(st+x*i-a[i]));    }    return mx;}int main(){    int i;    while(~scanf("%d",&n))    {        int sum=0;        for(i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        sort(a,a+n);        for(i=1;i<n;i++)sum+=a[i]-a[i-1];        int mid1,mid2,p1,p2;        int biao=dos(a[0],sum/(n-1));        int as,bs;        as=a[0];        bs=sum/(n-1);        //cout<<sum<<" "<<biao<<endl;        for(i=a[0]-biao;i<=a[0]+biao;i++)        {            int ll=0;            int rr=a[n-1]-a[0];            while(ll<=rr)            {                mid1=ll+(rr-ll)/3;                mid2=rr-(rr-ll)/3;                p1=dos(i,mid1);                p2=dos(i,mid2);                if(p1<p2)rr=mid2-1;                else ll=mid1+1;            }            p1=dos(i,ll-1);            if(biao>p1)            {                biao=p1;                as=i;                bs=ll-1;            }        }        cout<<biao<<endl;        cout<<as<<" "<<bs<<endl;    }    return 0;}







0 0
原创粉丝点击