【noip模擬賽7】上網 線性dp
阿新 • • 發佈:2019-03-26
時間 turn col 個數 efi view ont 接下來 時間段
[10,10]內,安排3上網,快樂程度為3;
描述
假設有n個人要上網,卻只有1臺電腦可以上網。上網的時間是從1 szw 至 T szw ,szw是sxc,zsx,wl自創的時間單位,至於 szw怎麽換算成s,min或h,沒有人清楚。依次給出每個人在某個時間段內上網的快樂程度C(必須這個人在整個時間段內都在上網,才能獲得快樂程度C,否則,快樂程度是0),請你得到使總的快樂程度達到最大的方案。
輸入
第1行2個整數 n和T,含義如題目所述;
接下來有n個這樣的結構(每兩個相鄰的結構之間有一空行,且第1個結構和第一行間有一空行):
第1行一個整數Mi,表示第i個人的時間段的個數;
接下來有Mi行,每行3個整數Xj,Yj,C,表示第i個人在[Xj,Yj]內上網的快樂程度為C,
因此有Xj-Yj-1=1,X1=1,Ymi=T,Xj<=Yj。
輸出
僅輸出一行,為總的最大的快樂程度。
輸入樣例 1
3 10 3 1 3 6 4 7 9 8 10 3 3 1 3 5 4 7 10 8 10 1 4 1 3 2 4 8 2 9 9 6 10 10 3
輸出樣例 1
25
提示
【樣例說明】
在[1,3]內,安排1上網,快樂程度為6;
在[4,7]內,安排2上網,快樂程度為10;
在[8,8]內,不安排;
在[9,9]內,安排3上網,快樂程度為6;
在
這是使總的快樂程度達到最大的方案,對應的值是25。
【數據範圍】
對於30%的數據,n<=4,所有的Mi<=5,T<=20;
對於60%的數據,n<=100,所有的Mi<=100,T<=2000;
對於100%的數據,n<=500,所有的Mi<=500,T<=500000,所有的0<C<=10^9,並保證最終解Max<=10^9。
以結束時間來dp即可 和背包沒什麽兩樣
註意其中的一個細節 因為這個wa了一次
#include<bits/stdc++.h> using namespaceView Codestd; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define pb push_back #define fi first #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) /////////////////////////////////// #define inf 0x3f3f3f3f #define N 1000+50 struct node { int s,e,v; }s[500000+5]; vector<int>tim[500000+5]; long long dp[500000+5]; int main() { int n,T; RII(n,T); int cnt=0; rep(i,1,n) { int q; RI(q); while(q--) { int a,b,c; RIII(a,b,c); if(b>T)continue; s[++cnt].s=a; s[cnt].e=b; s[cnt].v=c; tim[b].pb(cnt); } } rep(i,1,T) { dp[i]=dp[i-1]; if(tim[i].size() ) rep(j,0,tim[i].size()-1) { int u=tim[i][j]; dp[i]=max(dp[i],dp[i-(s[u].e-s[u].s+1)]+s[u].v );//註意這裏一定要加一 舉個起點和終點相等的例子即可 } } cout<<dp[T]; return 0; }
【noip模擬賽7】上網 線性dp