1. 程式人生 > >動態規劃 洛谷P1868 饑餓的奶牛

動態規劃 洛谷P1868 饑餓的奶牛

文字 div color nod code sin stream 水題 翻譯

P1868 饑餓的奶牛

題目描述

有一條奶牛沖出了圍欄,來到了一處聖地(對於奶牛來說),上面用牛語寫著一段文字。

現用漢語翻譯為:

有N個區間,每個區間x,y表示提供的x~y共y-x+1堆優質牧草。你可以選擇任意區間但不能有重復的部分。

對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。

輸入輸出格式

輸入格式:

第一行,N,如題

接下來N行,每行一個數x,y,如題

輸出格式:

一個數,最多的區間數

輸入輸出樣例

輸入樣例#1:
3
1 3
7 8
3 4
輸出樣例#1:
5

說明

1<=n<=150000

0<=x<=y<=3000000

我太菜了......難受

第一遍寫了個zz的貪心,剛寫完就發現錯誤了

第二遍二維動歸,迷之錯誤,現在我仍然不知道為什麽二維是錯的

第三遍改邪歸正,老老實實地瞎寫......

記錄幾句毒雞湯:

1.別學了,退役吧

2.高考都這麽菜,退役吧

3.下學期就省賽了,你連這水題都不會做,退役吧

4.待更新......

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,ans;
7 struct data{ 8 int x,y,len; 9 }node[2000010]; 10 int f[4000010]; 11 bool cmp(const data&aa,const data&bb){ 12 return aa.y<bb.y; 13 } 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++){ 17 scanf("%d%d",&node[i].x,&node[i].y); 18 node[i].len=node[i].y-node[i].x+1
; 19 } 20 sort(node+1,node+n+1,cmp); 21 for(int i=1;i<=n;i++){ 22 for(int j=node[i].y-1;j>=0;j--){ 23 if(f[j]) break; 24 f[j]=ans; 25 } 26 f[node[i].y]=max(f[node[i].x-1]+node[i].len,ans); 27 ans=max(f[node[i].y],ans); 28 } 29 printf("%d",ans); 30 return 0; 31 }

動態規劃 洛谷P1868 饑餓的奶牛