Codeforces 845B Luba And The Ticket (贪心)

题目链接

CF 845B

题目大意

输入六位数字,问至少改变多少个数位能使前三位的和等于后三位的和。

分析

简单的贪心。
对于初始的六位数字,我们计算前三位的和与后三位的和,接着要让每次操作都尽可能多的填补前三位和与后三位和的差距。和较小的那一组中每一位最多能弥补的差距为9减去其数位(将其变大至9),和较大的那一组中每一位最多能弥补的差距为其数位(将其变为0),则按6个数位最多能弥补的差距排序,从大往小尽可能填补差距,使差距小于等于0即可。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#define ls (rt<<1)
#define rs (rt<<1|1)
using namespace std;
const double pi=4*atan(1.0);
const int MAXN=100010;
const int MAXM=2*MAXN;

bool cmp(int a,int b)
{
    return (a>b);
}
int main()
{
    int a[10],num1,num2,s,ans;
    string str;
    cin>>str;
    num1=str[0]+str[1]+str[2]-3*'0';
    num2=str[3]+str[4]+str[5]-3*'0';
    ans=0;
    if (num1==num2)
        cout<<0<<endl;
    else if (num1<num2)
    {
        a[0]=9-(str[0]-'0');
        a[1]=9-(str[1]-'0');
        a[2]=9-(str[2]-'0');
        a[3]=str[3]-'0';
        a[4]=str[4]-'0';
        a[5]=str[5]-'0';
        sort(a,a+6,cmp);
        s=num2-num1;
        while (s>0)
        {
            s-=(a[ans++]);
        }
        cout<<ans<<endl;
    }
    else if (num1>num2)
    {
        a[0]=str[0]-'0';
        a[1]=str[1]-'0';
        a[2]=str[2]-'0';
        a[3]=9-(str[3]-'0');
        a[4]=9-(str[4]-'0');
        a[5]=9-(str[5]-'0');
        sort(a,a+6,cmp);
        s=num1-num2;
        while (s>0)
        {
            s-=(a[ans++]);
        }
        cout<<ans<<endl;
    }
    return 0;
}
/*
651894
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值