[] JZOJ6367プラント(工場)

説明

偉大な神のwypが工場を開設し、工場はn及びp組立ラインの労働者を持っています。
工場労働者は、睡眠の神であるため、i番目の労働者は、一度にSI tiの中で動作します。
各ワーカーには出席し、しかし、回線にのみ、このラインでの組立ラインの作業員が割り当てられます
残りの部分にのみ、一部の労働者があっても、残りの時間を開始します。
神の神託が大きいwypよると、作業時間のラインを持つことができない0で、労働者はに割り当てられている必要はありませんでした
(これは実際の作業時間を削減する場合でも)ライン。
労働者は、しかし、オフDP、その労働時間の最大合計は得ることができます見つけてください。
PROTECTION症候群。通報メッシュ。スモール。存在している。に。A.種類。有限方法。断。リガンド牙。事例として。
より良い問題を理解するために、サンプルをお読みください。


分析

  • 最初の2つのセクションのいずれかが含まれていないセクションにすべての\(\)間隔の少なくとも一つの部分を含むセットを、\(Bの\)セット

  • だから、明らかに\(Bの\)部分とで\(A \)回答のセットには確かに良く、その後、検討していない(Bの\)\個別にグループ化されている区間で

  • 左端ソート後\(\)をする(DP \)\設け、([I] [J fを\ \]) 群から選択前者表す\(Iは\)分割間隔\(J \)が最大値を設定します答え

  • \(F [j]と[K + 1] = MAX(F [i]が[K] + T [j + 1] -s [J])\(S [J] <T [J + 1])\) 、\ (O(N ^ 3)\)転送

  • 2つの間隔の転送を確保するための制限事項が支払わなければなりません

  • 最後にすることによって、いくつかの間隔で存在列挙されている(\ \)間隔組成、残りの部分は、取ることができる\(B \)をいくつかの別々のパケットの最長間隔を


コード

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 205
#define ha 19260817
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

ll f[MAXN][MAXN];
bool bz[MAXN];
ll pre[MAXN];
ll n,m,p,tmp,ans=-ha;

struct node
{
    ll x,y;
}a[MAXN],A[MAXN],B[MAXN];

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline bool cmp(node a,node b){return a.y-a.x>b.y-b.x;}
inline bool cmpp(node a,node b){return a.x<b.x;}
int main()
{
    //freopen("T2.in","r",stdin);
    freopen("factory.in","r",stdin);
    freopen("factory.out","w",stdout);
    n=read(),p=read(),memset(bz,1,sizeof(bz));
    fo(i,1,n)a[i].x=read(),a[i].y=read();
    fo(i,1,n)fo(j,1,n)if (i!=j)
    if ((a[i].x<a[j].x && a[j].y<=a[i].y) || (a[i].x<=a[j].x && a[j].y<a[i].y)){B[++tmp]=a[i],bz[i]=0;break;}
    fo(i,1,n)if (bz[i])A[++m]=a[i];
    sort(A+1,A+m+1,cmpp);
    memset(f,128,sizeof(f)),f[0][0]=0;
    fo(i,0,m-1)fo(k,0,p-1)fo(j,i+1,m)if (A[j].x<A[i+1].y)f[j][k+1]=max(f[j][k+1],f[i][k]+A[i+1].y-A[j].x);
    sort(B+1,B+n-m+1,cmp);
    fo(i,1,n-m)pre[i]=pre[i-1]+B[i].y-B[i].x;
    fo(i,1,p)ans=max(ans,f[m][i]+pre[p-i]);
    printf("%lld\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/horizonwd/p/11594898.html