给你6位数,问你至少改变多少位才能使得前3位的和等于后三位,直接模拟,我这里t表示每次改变的值,把t排一下序两边差值每次减去t[i]就好了
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<string>
#include<stdio.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<deque>
using namespace std;
#define lson k*2
#define rson k*2+1
#define M (t[k].l+t[k].r)/2
#define INF 1008611111
#define ll long long
#define eps 1e-15
int a[10];
int t[10];
int cmp(int x,int y)//从大到小排序
{
return x>y;
}
int main()
{
int i,j,n,num1,num2;
for(i=0;i<6;i++)
{
scanf("%1d",&a[i]);
}
num1=a[0]+a[1]+a[2];
num2=a[3]+a[4]+a[5];
if(num1==num2)
printf("0\n");
else
{
int ans=0;
sort(a,a+3);//对前三位排序
sort(a+3,a+6);//后三位排序
int d=abs(num1-num2);
if(num1>num2)
{
t[0]=a[0];
t[1]=a[1];
t[2]=a[2];
t[3]=9-a[3];
t[4]=9-a[4];
t[5]=9-a[5];
sort(t,t+6,cmp);//对t从大到小排序,表示每次可以改变的差值
for(i=0;i<6;i++)
{
if(d<=t[i])
{
ans=i+1;
break;
}
else
d-=t[i];
}
}
else
{
t[0]=a[3];
t[1]=a[4];
t[2]=a[5];
t[3]=9-a[0];
t[4]=9-a[1];
t[5]=9-a[2];
sort(t,t+6,cmp);
for(i=0;i<6;i++)
{
if(d<=t[i])
{
ans=i+1;
break;
}
else
d-=t[i];
}
}
printf("%d\n",ans);
}
return 0;
}