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

A题:

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

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define LL __int64
using 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 __int64
using 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 __int64
using 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 99999999
using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值