zoukankan      html  css  js  c++  java
  • CodeForces

    题意

    https://vjudge.net/problem/CodeForces-1257E

    三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人拥有1~i的数,第二个人拥有i+1~j的数,第三个人拥有j+1~n的数,即第一个人为前缀,第二个人为中间部分,第三个人为后缀。 注意:可以有一个或两个人最后不拥有数字。

    思路

    先把问题简单化,考虑只有两个人的情况。设cnt1[x]表示第一个人前x个数拥有的个数,cnt2[x]表示第二个人前x个数拥有的个数,如果第一个人获得的前缀为1~i,第二个人获得的后缀为i+1~n,那么代价为cnt2[i]+cnt1[n]-cnt1[i]。

    再考虑三个人的情况,同样,如果第一个人获得1~i,第二个人获得i+1~j,第三个人获得j+1~n,那么代价为cnt2[i]+cnt3[i]  +cnt1[j]-cnt1[i]+cnt3[j]-cnt3[i]  +  cnt1[n]-cnt1[j]+cnt2[n]-cnt2[j],化简得:cnt2[i]-cnt1[i]+cnt3[j]+cnt1[n]+cnt2[n]-cnt2[j],即cnt2[i]-cnt1[i] + cnt1[n]+cnt2[n] + cnt3[j]-cnt2[j],所以枚举i,使这个式子值最小,发现还剩下两个和j有关的项对式子有影响,而j>=i,于是问题转化成了枚举i,求cnt2[i]-cnt1[i]+min(cnt3[i~n]-cnt2[i~n])+cnt1[n]+cnt2[n],我们只用维护cnt3[j]-cnt2[j]的后缀最小值即可。

    注意:因为可能有一个人或两个人没有任何数,那么此时i和j是可以相等的,比如i==j时第二个人没有数,i==j==0时第1、2个人没有数,i==j==n时第二、三个人没有数,i==0&&j==n时第1、3个人没有数,等等情况

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    #define ll long long
    const int N=200005;
    const int mod=1e9+7;
    const double eps=1e-8;
    const double PI = acos(-1.0);
    #define lowbit(x) (x&(-x))
    int a[4][N];
    int c[4][N],mn[N];
    int main()
    {
        std::ios::sync_with_stdio(false);
        int k1,k2,k3;
        cin>>k1>>k2>>k3;
        int n=k1+k2+k3;
        for(int i=1;i<=k1;i++)
        {
            cin>>a[1][i];
            ++c[1][a[1][i]];
        }
        for(int i=1;i<=k2;i++)
        {
            cin>>a[2][i];
            ++c[2][a[2][i]];
        }
        for(int i=1;i<=k3;i++)
        {
            cin>>a[3][i];
            ++c[3][a[3][i]];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=3;j++)
            {
                c[j][i]+=c[j][i-1];
            }
        }
        mn[n+1]=inf;
        for(int i=n;i>=0;i--)
        {
            mn[i]=min(mn[i+1],c[3][i]-c[2][i]);
        }
        int ans=inf;
        for(int i=0;i<=n;i++)
        {
            ans=min(ans,c[2][i]-c[1][i]+mn[i]+c[1][n]+c[2][n]);
     //       cout<<i<<" "<<ans<<endl;
        }
        cout<<ans<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    Linux和windows 查看程序、进程的依赖库的方法
    ida pro 使用
    sql server相关
    nginx 日志log_format格式
    .yml文件格式
    svn加锁设置
    包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解
    visual studio 2017 (vs2017安装)
    OpenResty编译安装
    微信扫描二维码登录网站技术原理
  • 原文地址:https://www.cnblogs.com/mcq1999/p/11887258.html
Copyright © 2011-2022 走看看