题目大意:给一个长度为6的字符串,可以使任意数变为另一个数,问最多需要几次变换使前三个数的和等于后三个数的和
做法:我刚开始用了一个6*10^6的做法,暴力枚举出所有可能的前三位和等于后三位的数,然后判断要改变几次,去min。
代码如下:
#include
#include
#include
#include
#include
#include
using namespace std;
char s[10];
int a[10];
int main()
{
int ans=100000;
cin>>s;
int n=strlen(s);
for (int i=0;ii+j+k) break;
for (int kk=0;kk<=9;kk++){
if (ii+jj+kk==i+j+k){
int tot=0;
if (a[1]!=i) tot++;
if (a[2]!=j) tot++;
if (a[3]!=k) tot++;
if (a[4]!=ii) tot++;
if (a[5]!=jj) tot++;
if (a[6]!=kk) tot++;
ans=min(ans,tot);
}
}
}
}
}
}
}
printf("%d\n",ans);
return 0;
}
后面有人告诉我有一个贪心做法:
对于初始的六位数字,我们计算前三位的和与后三位的和,接着要让每次操作都尽可能多的填补前三位和与后三位和的差距。和较小的那一组中每一位最多能弥补的差距为9减去其数位(将其变大至9),和较大的那一组中每一位最多能弥补的差距为其数位(将其变为0),则按6个数位最多能弥补的差距排序,从大往小尽可能填补差距,使差距小于等于0即可
这个竟然没有想到真的不应该。
代码如下:
#include
#include
#include
#include
#include
#include
using namespace std;
char s[50005];
int a[1005],b[1005];
int sum1=0,sum2=0;
int main()
{
cin>>s;
int n=strlen(s);
for (int i=0;i=1;i--){
if (sum>=abs(sum1-sum2)){
printf("%d\n",6-i);
return 0;
}
sum=sum+b[i];
}
cout<<0<