Binary Transformation(贪心 1 1)

#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;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/82118182