複数のpoj1014バックパック - モノトーンキューの最適化

複数のバックパック、我々はすべて知っているときのOの複雑さ(N ^ 3)。しかし、多くのタイトルにアクセスすることはできませんこの複雑。バイナリグループ化、スタックの最適化など:だからのような最適化の様々ながあるでしょう。
しかし、最善のことは、単調なキューの最適化です。

それがある場合はどのようにそれを達成するには?
それとものためのダイビングpod1014中!
この質問では、複数のバックパックを使用することによって解決することができます。

まず、両端の単調キューは満たす単調内部キュー、キューの末尾に挿入され、削除されました。
私たちは、キューの長さとその単調さを制御します。
ここでは、重量、価値、数量を表すために、W、V、合計を使用します。
まず、残りのクラスI F [X] MODのWを分類します。
記事の重みw、唯一F [XW]、F [X -2 * W]、F [X-3 * W] ... F [XK * W] 答えが影響しました。
異なるFプラスkとして[XK * W]は* Vは異なっています。
この時点では、この問題を解決するためのスマートな方法があります。
設定X = K * X + C、
その後単調にそれをk * Vを減算するキューは、
Y = M * X + Cの場合には、最大キュー単調プラスM * Vを除去する必要があります。
ときに除去F [X]、F [X ] = F [X] +(CA)* V。
この値は、プラスまさに必要とされている値。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define For(aa,bb,cc) for(int aa=bb;aa<=cc;++aa)
#define Set(aa,bb) memset(aa,bb,sizeof(aa))
using namespace std;
const int maxn=1000010;
int f[maxn];
int a[10],all,sum;
int q1[maxn],q2[maxn],l1,r1,l2,r2;

void work(){
    Set(f,0);
    all>>=1;
    int w,v,l,k;
    For(i,1,6){
        w=v=i;
        For(j,0,w-1){
            l1=l2=1,r1=r2=0;
            for(k=j,l=0;k<=all;++l,k+=w){
                if(r1-l1==a[i]){//以a[i]的大小取剩余类
                    if(q1[l1]==q2[l2]) ++l2;
                    ++l1;
                }
                int t=f[k]-l*v;//将全体都减去一个大小,放入单调队列中
                q1[++r1]=t;
                while(l2<=r2 && q2[r2]<t) --r2;
                q2[++r2]=t;
                f[k]=q2[l2]+l*v;//重新计算
            }
        }
    }
    if(f[all]==all) puts("Can be divided.");
    else puts("Can't be divided.");
    return ;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    while(1){
        all=0;
        For(i,1,6) scanf("%d",&a[i]),all+=a[i]*i;
        if(!all) break;
        ++sum;
        printf("Collection #%d:\n",sum);
        if(all&1){puts("Can't be divided.");puts("");continue;}
        work();
        puts("");
    }
    return 0;
}
公開された51元の記事 ウォンの賞賛6 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_35776579/article/details/54945856