C题具体应该怎么想才是正确的?感觉怎么想都会被hack

同上

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y;
int ggg(vector<pair<char,char>>d)
{
    int i;
    int co1=0,co2=0;
    for(auto v:d)
    {
        if(v.first=='1')
        co1++;
        else
        co2++;
    }
    int minn=min(co1,co2);
    int ans=minn*y;
    int co11=0,co00=0;
    for(i=2*minn;i<d.size();i++)
    {
        if(d[i].second=='1')
        co11++;
        else
        co00++;
    }
    ans+=min(co11,co00)*y;
    int dd=d.size()-2*min(co11,co00)-2*minn;
    ans+=dd*x;
    return ans;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    cin>>n>>x>>y;
    string a,b,c;
    cin>>a>>b>>c;
    a=" "+a;
    b=" "+b;
    c=" "+c;
    int i;
    vector<pair<char,char>>d,f;
    for(i=1;i<=n;i++)
    {
        if(c[i]=='1')
        {
            if(b[i]==a[i])
            {
                d.push_back({a[i],b[i]});
                f.push_back({b[i],a[i]});
            }
        }
        else
        {
            if(a[i]!=b[i])
            {
                d.push_back({a[i],b[i]});
                f.push_back({b[i],a[i]});
            }
        }
    }
    if(2*x<y)
    {
        cout<<d.size()*x;
        return 0;
    }
    sort(d.begin(),d.end());
    sort(f.begin(),f.end());
    cout<<min(ggg(d),ggg(f));
    return 0;
}

全部评论
试试一二三四 的不合法数是:5 3 3 3能过不
2 回复 分享
发布于 02-08 19:50 广东
称a^b不等于c的数位为不合法位置。 首先,我们只用考虑把不合法位置变合法。 操作一二只能把某个不合法位置变合法。 操作三四只能把偶数个不合法位置变合法。 如果y超过2x,直接把不合法位置一个一个翻不劣。 如果y不足2x,考虑尽可能用操作三四处理。 对所有不合法位置,根据a,b的值分类为:00,01,10,11。 操作三四相当于让两类数的个数减一,一直取最大的两个减就好,这就是操作三四可达的最大次数。 剩下的就交给操作一二。
2 回复 分享
发布于 02-08 18:33 广东
问题其实是在于匹配的顺序是有讲究的,例如这四种不满足的如果是3,5,7,13的话,如果处理不当,会非常又可能剩下多的就会导致错误的答案,但是如果你合理处理的话,这里的3,5,7,13是可以消除成0的,按照你的代码这里的3,5,7,13组合后是不会消除到0的,但是实际是可以的(结论是如果最小的三个数加起来大于最大的数的情况下,如果这四个加起来为奇数,最后就消除到只剩1个,否则可以全部消除掉  ,而如果加起来还小于最大数的话,那就是最大的数减去最小数后多出来的数只能用反置)
1 回复 分享
发布于 02-08 19:57 广东

相关推荐

不愿透露姓名的神秘牛友
07-15 17:24
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务