1. 程式人生 > >【jzoj5350】【NOIP2017提高A組模擬9.7】【陶陶摘蘋果】【動態規劃】

【jzoj5350】【NOIP2017提高A組模擬9.7】【陶陶摘蘋果】【動態規劃】

description

這裡寫圖片描述

solution

題目的意思是板凳不可重疊,資料不能直接摘蘋果。對蘋果排序,對凳子按r從小到大排序。設f[i][j]表示前i個凳子,選了j個,最後一個選了i的最大貢獻,列舉由那個f[k][j-1]轉移過來,能貢獻多少就在蘋果序上二分再max一下i左端點k右端點+1即可。

code

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LF double
#define LL long long
#define ULL unsigned int
#define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) #define fr(i,j) for(int i=begin[j];i;i=next[i]) using namespace std; int const mn=1e6+3,mm=200+3,inf=1e9+7; int n,m,h,K,a[mn],f[mm][mm]; struct rec{ int l,r; }; rec b[mm]; bool cmp(rec x,rec y){ return x.r<y.r; } int
main(){ freopen("apple.in","r",stdin); freopen("apple.out","w",stdout); scanf("%d%d%d%d",&n,&m,&h,&K); fo(i,1,n)scanf("%d",&a[i]); a[n+1]=inf; fo(i,1,m)scanf("%d%d",&b[i].l,&b[i].r); sort(a+1,a+n+1); fo(i,1,m){ b[i].l=lower_bound(a+1
,a+n+2,h+b[i].l)-a; b[i].r=lower_bound(a+1,a+n+2,h+b[i].r+1)-a-1; } sort(b+1,b+m+1,cmp); fo(i,1,m)fo(j,1,K){ f[i][j]=f[i-1][j]; fo(k,0,i-1) f[i][j]=max(f[i][j],f[k][j-1]+max(b[i].r-max(b[i].l,b[k].r+1)+1,0)); } printf("%d",f[m][K]); return 0; }