codeforces 845B

题目大意:给一个长度为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<



你可能感兴趣的:(codeforces,codeforces)