题意:给你一个六位数(可以有前导零),你可以将任意一位的数字变为任意其他数字,求最少变多少次使得前三个数字之和与后三个数字之和相等。
思路:贪心,每次改变数字都要使两个和接近的最多。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
char s[10];
while(cin>>s)
{
int sum[5]={0},add[10]={0};
for(int i=0;i<6;i++)
sum[i/3] += s[i] - '0',add[i] = '9' - s[i];
if(sum[0]>=sum[1])
{
for(int i=0;i<3;i++)
add[i] = 9 - add[i];
}
else
{
swap(sum[0],sum[1]);
for(int i=3;i<6;i++)
add[i] = 9 - add[i],swap(add[i-3],add[i]);
}
for(int i=0;i<6;i++)
{
if(sum[0]<=sum[1])
{
printf("%d\n",i);
break;
}
int mx = 0,pos = -1;
for(int j=0;j<6;j++)
{
if(mx<add[j])
{
mx = add[j];
pos = j;
}
}
add[pos] = 0;
if(pos<3)
sum[0] -=mx;
else
sum[1] +=mx;
}
}
return 0;
}