#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 100010
#define MAXM 5010
long long c[MAXN];
int n,cnt;
char a[MAXN],b[MAXN];
int vis[MAXN];
struct node
{
long long w;
int id;
}e[MAXN],p[MAXN];
bool cmp1(node x,node y)
{
return x.w>y.w;
}
long long solve()
{
int i;
long long sum=0,ans=0;
for(i=0;i<=n-1;i++)
{
if(a[i]=='1')
sum+=c[i]; //sum存的是当前所有为1的和
}
for(i=0;i<=n-1;i++)
{
int u=e[i].id;
if(vis[u]||(a[u]=='1'&&b[u]=='0'))
{
sum-=c[u]; //该点为1 1的话
ans+=sum; //多了种去其1取当前所有1的操作
}
}
for(i=n-1;i>=0;i--) //该点为1 1的话,多了种加其1,取当前所有1的操作
{
int u=e[i].id;
if(vis[u]||(a[u]=='0'&&b[u]=='1'))
{
sum+=c[u];
ans+=sum;
}
}
return ans;
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&c[i]);
e[i].id=i;
e[i].w=c[i];
}
sort(e,e+n,cmp1);
scanf("%s%s",a,b);
cnt=0;
for(i=0;i<n;i++)
{
if(a[i]=='1'&&b[i]=='1')
{
p[cnt].id=i;
p[cnt++].w=c[i];
}
}
sort(p,p+cnt,cmp1);
memset(vis,0,sizeof(vis));
long long ans=solve(); //第一遍应该是不讨论1,1的情况。
//简单的贪心就行
for(i=0;i<cnt;i++)
{
vis[p[i].id]=1; //vis用来处理1 1的情况真的很巧妙
long long res=solve();
ans=min(ans,res);
}
printf("%lld\n",ans);
return 0;
}
Binary Transformation(贪心 1 1)
猜你喜欢
转载自blog.csdn.net/xigongdali/article/details/82118182
今日推荐
周排行