题目链接
题目大意
输入六位数字,问至少改变多少个数位能使前三位的和等于后三位的和。
分析
简单的贪心。
对于初始的六位数字,我们计算前三位的和与后三位的和,接着要让每次操作都尽可能多的填补前三位和与后三位和的差距。和较小的那一组中每一位最多能弥补的差距为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
*/