1002 Binary Addition 2020 年百度之星·程序设计大赛 - 复赛

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=892&pid=1002

第2种操作肯定只会操作1次,而且在i位置操作必须让前i位都变成1后再全变0向后进1位,才可能比直接换更优。

你让S的一堆0变成1以后,再把他们全变0,如果之后要再进行一次操作的话,又要把他们全变1,肯定不优,那么最多操作一次

那么我们枚举每一个i,算出前i位变为1的答案,跟总答案比较一下就行了,肯定中间有很多不太好的答案,但是扫过去总能找到最佳答案。

#include
#define pb push_back
using namespace std;
typedef long long ll;

const int maxl=1e5+10;

int n,m,cas,k,cnt,tot,ans;
int f[maxl],dp[maxl];
int sums[maxl],sumt[maxl];
char s[maxl],t[maxl];
bool in[maxl]; 

inline void prework()
{
	scanf("%d",&n);
	scanf("%s",s+1);scanf("%s",t+1);
	int tmp;ans=0;s[n+1]='0';t[n+1]='0';
	for(int i=1;i<=n+1;i++)
	{
		sums[i]=sums[i-1];sumt[i]=sumt[i-1];
		if(s[i]=='1')
			sums[i]++;
		if(t[i]=='1')
			sumt[i]++;
		if(s[i]!=t[i])
			ans++;
		f[i]=ans;
	}
} 

inline void mainwork()
{
	int tmp;
	for(int i=1;i<=n;i++)
	{
		tmp=i-sums[i]+sumt[i]+1;
		if(s[i+1]=='1')
			tmp++;
		if(t[i+1]=='0')
			tmp++;
		tmp+=f[n+1]-f[i+1];
		ans=min(ans,tmp);
	}
}

inline void print()
{
	printf("%d\n",ans);
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

你可能感兴趣的:(1002 Binary Addition 2020 年百度之星·程序设计大赛 - 复赛)