1. 程式人生 > >【noip模擬賽7】上網 線性dp

【noip模擬賽7】上網 線性dp

時間 turn col 個數 efi view ont 接下來 時間段

描述

假設有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;

[10,10]內,安排3上網,快樂程度為3;

這是使總的快樂程度達到最大的方案,對應的值是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 namespace
std; //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; }
View Code

【noip模擬賽7】上網 線性dp