codeforces 845B

来源:互联网 发布:淘宝达人粉丝怎么刷 编辑:程序博客网 时间:2024/05/17 06:44

题目大意:给一个长度为6的字符串,可以使任意数变为另一个数,问最多需要几次变换使前三个数的和等于后三个数的和

做法:我刚开始用了一个6*10^6的做法,暴力枚举出所有可能的前三位和等于后三位的数,然后判断要改变几次,去min。

代码如下:

#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;char s[10];int a[10];int main(){int ans=100000;cin>>s;int n=strlen(s);for (int i=0;i<n;i++) a[i+1]=s[i]-'0';for (int i=0;i<=9;i++){for (int j=0;j<=9;j++){for (int k=0;k<=9;k++){for (int ii=0;ii<=9;ii++){for (int jj=0;jj<=9;jj++){if (ii+jj>i+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<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<cmath>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<n;i++) a[i+1]=s[i]-'0';for (int i=1;i<=3;i++) sum1=sum1+a[i];for (int i=4;i<=6;i++) sum2=sum2+a[i];if (sum1<sum2) for (int i=1;i<=3;i++) swap(a[i],a[i+3]);for (int i=1;i<=3;i++) b[i]=a[i];for (int i=4;i<=6;i++) b[i]=9-a[i];sort(b+1,b+7);int sum=0;for (int i=6;i>=1;i--){if (sum>=abs(sum1-sum2)){printf("%d\n",6-i);return 0;}sum=sum+b[i];}cout<<0<<endl;return 0;}



原创粉丝点击