51nod 一級演算法 1091 貪心

2021-08-05 22:33:23 字數 827 閱讀 5286

題目

思路:一段一段的線段貪心。

首先將   線段的起始點按照從小到大排序,起點相同的時候按照終點從大到小排序。

為什麼呢? 因為首先假設兩個線段有重疊的話,(也就是第二個線段的起點在第乙個線段的中間)兩個線段覆蓋情況有兩種:乙個是第乙個的包含了第二個的(第乙個的終點在第二個的終點的右邊),乙個是第乙個的終點在第二個線段的終點的左邊。

對於第一種情況,ans肯定是小線段的長度,但是下次比較是拿新的線段和大的線段進行比較,也就是不更新。因為。。。。你畫一下就知道了qaq

對於第二種情況,ans==第乙個的終點減去第二個線段的起點,下次拿新的線段和第二個線段進行比較,即更新了。因為,新的線段的起點肯定比前面兩個線段大一些(排序排的),那麼主要是看終點的問題,第二個線段的終點比第乙個大,所以把線段更新到第二個咯,也可以畫一下就理解了。

把上面兩種情況理解了,反過來就能理解為什麼排序要那個樣子牌排。如果起點相同按照終點從小到大排,就會發現新的線段到底和前面哪乙個線段比較呢?很難更新。

實際上我們是盡量要找。。。區間「長」的,這樣被覆蓋的可能性越大。

ac**:

#include #include #include #define max(x,y) ((x)>(y)?(x):(y))

using namespace std;

struct stua[50001];

int cmp(stu p,stu q)

sort(a,a+n,cmp);

int ans=0;

stu temp=a[0];//拿來比較的那個線段

for(int i=1;itemp.e)

else

}cout<

51nod 一級演算法題總結

歷時幾天,期待51nod一級演算法題,終於刷完了,雖然題目的 意思蠻好理解 大多 但是資料量都很大,都需要用比較好的演算法,並不是簡單的幾重迴圈就能搞定的了,其中讓我學到了很多,明白一點時間複雜度,以前刷題都是有思路,能解決就行了,現在回想一下,真是進步了不少,希望我能在演算法的這條路上能一直堅持下...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

貪心演算法 51nod排隊接水

n個人一起排隊接水,第i個人需要b i 的時間來接水。1 n 1000 0 b i 1000 同時只能有乙個人接水,正在接水的人和沒有接水的人都需要等待。完成接水的人會立刻消失,不會繼續等待。你可以決定所有人接水的順序,並希望最小化所有人等待時間的總和。收起第一行乙個整數n 接下來n行,每行乙個整數...