1,看起來就難裡難氣的。
2,關鍵是思想吧,在可選的工作中每次都選擇結束時間最早的工作。
3,對了還要再獨立寫一遍才算。
#include#includeusing
namespace
std;
int n,s[1005],t[1005
];pair
itv[1005
];int ans=0,t=0
; int
main()
for(int i=0;is[i];}
sort(itv,itv+n);
//不過這個排序應該是以first為首,second跟著變
//所以就把結束時間早的給排到前面去了
for(int i=0;i)
}//設計的還是很巧妙的
cout}
4,記住是獨立得寫出來。
5,還有費曼一方面從巨集觀上費曼整個題目,一方面從微觀的角度費曼一些**細節。
6,經過我這裡的經驗,發現三遍也不一定好。
分三個階段
第一,借助各種方法實現了一遍(標誌是起碼已經通過樣例了(或者ac))
第二,開始單純寫**,表示是能夠獨立寫一遍之後,開始用腦子過一遍整個題目,然後再寫最後一遍。
第三,開始費曼,一方面費曼大的題目題意,一方面費曼小的**細節。
7,費大。簡化為乙個簡陋版的拼湊問題,因為一般的拼湊是恰好,這個不要求恰好,但是拼湊的時候你可以不足,但是不可以超過。
(也可以想象成不足可以用膠水什麼的粘上,但是為了盡量少用膠水,所以要盡量多的木板)
然後我們的解決方法就是每次在可選擇的中的木板中選
//不行,你這樣拼湊的話失去了人家固有的兩個屬性。
若干個具有兩個可以比較的屬性的事務,重點比較最後乙個屬性。在選擇中新增了個貪心嘛(以最後乙個屬性為決定因素)。
那怎麼來深化**細節?
一,明確該模組**的變數以及各表示式的意義。
二,對該模組進行改寫。
#include#include#include
using
namespace
std;
const
int maxn=1005
;int
n,s[maxn],t[maxn];
pair
itv[maxn];
int ans=0,t=0
;int
main()
for(int i=0;is[i];}
sort(itv,itv+n);
for(int i=0;i)
}cout
}
7,改寫後的。
t=itv[0].first;
ans=1
;
for(int i=1;i)
區間排程問題
有n項工作,每項工作分別在start i 時間開始,在end i 時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊 即使是開始的瞬間與結束的瞬間重疊也是不允許的 那麼最多能參與多少項工作?演算法思想 在可選的工作中,每次都選取結束時間最早的...
區間排程問題
有n項工作,每項工作分別在start i 時間開始,在end i 時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊 即使是開始的瞬間與結束的瞬間重疊也是不允許的 那麼最多能參與多少項工作?演算法思想 在可選的工作中,每次都選取結束時間最早的...
區間排程問題
我們要選擇結束時間最早的,這樣才能保證選的區間比較多,因此這個裡面會有對區間的排序,結束時間最早排在前面,運用了pair,pair中有兩個屬性就是first,second,把s存在了second中,把t存在了first中,這樣就可以把結束時間最早放在前面。include include includ...