bzoj3174 [Tjoi2013]拯救小矮人

首先,我們要證明一定存在一個最優逃生序列ai滿足:
Aa*i + *Bai <= Aai+1 + Bai+1;
可採用反證法得知對於所有逃生序列ai,交換滿足存在:
Aa*i + *Bai > Aai+1 + Bai+1 的數對一定不會更差,從而得證;
這樣就爲我們提供了一個序,然後就可以dp啦

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define rep2(i,k,n) for(int i=k;i>=n;i--)
using namespace std;
const int N=2017;
struct data{
    int a,b;void in(){scanf("%d%d",&a,&b);}
}D[N];
bool cmp(data x,data y){return x.a+x.b < y.a+y.b;}
int H,n,l,f[N],ans=0;
int main(){
    memset(f,-1,sizeof(f));f[0]=0;
    scanf("%d",&n);
    rep(i,1,n)D[i].in(),f[0]+=D[i].a;
    scanf("%d",&H);
    sort(D+1,D+n+1,cmp);
    rep(i,1,n){
        rep2(j,i-1,0)if(f[j]!=-1 && f[j]+D[i].b>=H){
            f[j+1]=max(f[j+1],f[j]-D[i].a);
            ans=max(ans,j+1);
        }
    }printf("%d\n",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章