Luba And The Ticket (CodeForces - 845B)

题意很明确,可以更换6个数字,使得    sum[1~3]==sum[4~6];

有三种方法,第一种暴力,枚举,和技巧。

一、暴力型:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char a[7];
    scanf("%s",a);
    int cnt=3;
    if(a[0]+a[1]+a[2]==a[3]+a[4]+a[5])
    {
        printf("0\n");
        return 0;
    }
    int a1,a2,a3,a4,a5,a6;
    a1=a[0]-'0';
    a2=a[1]-'0';
    a3=a[2]-'0';
    a4=a[3]-'0';
    a5=a[4]-'0';
    a6=a[5]-'0';
    for(int i1=0;i1<10;i1++)
    {
        for(int i2=0;i2<10;i2++)
         {
            for(int i3=0;i3<10;i3++)
            {
                for(int i4=0;i4<10;i4++)
                {
                    for(int i5=0;i5<10;i5++)
                    {
                        for(int i6=0;i6<10;i6++)
                        {
                            if(i1+i2+i3!=i4+i5+i6)
                                continue;
                            int ans=0;
                            ans+=(a[0]-'0'!=i1);
                            ans+=(a[1]-'0'!=i2);
                            ans+=(a[2]-'0'!=i3);
                            ans+=(a[3]-'0'!=i4);
                            ans+=(a[4]-'0'!=i5);
                            ans+=(a[5]-'0'!=i6);
                            cnt=min(ans,cnt);
                        }
                    }
                }
            }
         }
    }
    printf("%d\n",cnt);
    return 0;
}

二、枚举型:

#include<bits/stdc++.h>
using namespace std;
int maxz(int a,int b,int c)
{
    return max(a,b)>c?max(a,b):c;
}
int minz(int a,int b,int c)
{
    return min(a,b)<c?min(a,b):c;
}
int diff(int a,int b)
{
    return abs(a-b);
}
int mid(int a,int b,int c)
{
    int d[3]={a,b,c};
    sort(d,d+3);
    return d[1];
}
int main()
{
    char a[7];
    cin>>a;
    int b[6];
    for(int i=0;i<6;i++)
    {
        b[i]=a[i]-'0';
    }
    int sum1=b[0]+b[1]+b[2];
    int sum2=b[3]+b[4]+b[5];
    if(sum1==sum2)
    {
        printf("0\n");
        return 0;
    }
    else if(diff(sum1,sum2)>18)
    {
        printf("3\n");
        return 0;
    }
    else if(sum1>sum2&&(sum1-sum2<=9-minz(b[3],b[4],b[5])||sum1-sum2<=maxz(b[0],b[1],b[2])))
    {
        printf("1\n");
        return 0;
    }
    else if(sum1<sum2&&(sum2-sum1<=9-minz(b[0],b[1],b[2])||sum2-sum1<=maxz(b[3],b[4],b[5])))
    {
        printf("1\n");
        return 0;
    }
    else if(sum1>sum2&&diff(sum1,sum2)<=maxz(b[0],b[1],b[2])+9-minz(b[3],b[4],b[5]))
    {
        printf("2\n");
        return 0;
    }
    else if(sum1<sum2&&diff(sum1,sum2)<=maxz(b[3],b[4],b[5])+9-minz(b[0],b[1],b[2]))
    {
        printf("2\n");
        return 0;
    }
    else if(sum1>sum2&&diff(sum1,sum2)<=maxz(b[0],b[1],b[2])+mid(b[0],b[1],b[2]))
    {
        printf("2\n");
        return 0;
    }
    else if(sum1>sum2&&diff(sum1,sum2)<=18-minz(b[3],b[4],b[5])-mid(b[3],b[4],b[5]))
    {
        printf("2\n");
        return 0;
    }
    else if(sum2>sum1&&diff(sum1,sum2)<=maxz(b[3],b[4],b[5])+mid(b[3],b[4],b[5]))
    {
        printf("2\n");
        return 0;
    }
    else if(sum2>sum1&&diff(sum1,sum2)<=18-minz(b[0],b[1],b[2])-mid(b[0],b[1],b[2]))
    {
        printf("2\n");
        return 0;
    }
    else
    {
        printf("3\n");
        return 0;
    }

}

三、技巧型:

#include<bits/stdc++.h>
using namespace std;
int cmp(int a,int b)
{
    return a>b;
}
int main()
{
    char s[7];
        cin>>s;
    int sum=0;
    int a[6];
    for(int i=0;i<6;i++)
    {
        if(i<=2)
            sum+=s[i]-'0';
        else
            sum-=s[i]-'0';
    }
    if(sum==0)
    {
        return 0*printf("0\n");
    }
    else if(sum>0)
    {
        for(int i=0;i<6;i++)
        {
            if(i<3)
                a[i]=s[i]-'0';
            else
                a[i]=9-(s[i]-'0');
        }
    }
    else
    {
        for(int i=0;i<6;i++)
        {
            if(i<3)
                a[i]=9-(s[i]-'0');
            else
                a[i]=s[i]-'0';
        }
    }
    sum=abs(sum);
    sort(a,a+6,cmp);
    /*for(int i=0;i<6;i++)
    {
        printf("%d\n",a[i]);
    }*/
    for(int i=0;i<6;i++)
    {
         if(sum-a[i]<=0)
         {
            printf("%d\n",i+1);
            return 0;
         }
        else
            sum-=a[i];
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值