貪心 家庭作業

2021-09-02 18:52:22 字數 1443 閱讀 8338

題目描述

老師在開學第一天就把所有作業都布置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的。例如如果乙個作業學分為10,要求在6天內交,那麼要想拿到這10學分,就必須在第6天結束前交。

每個作業的完成時間都是只有一天。例如,假設有7次作業的學分和完成時間如下:

老師在開學第一天就把所有作業都布置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的。例如如果乙個作業學分為10,要求在6天內交,那麼要想拿到這10學分,就必須在第6天結束前交。

每個作業的完成時間都是只有一天。例如,假設有7次作業的學分和完成時間如下:

輸入第一行乙個整數n,表示作業的數量;

接下來n行,每行包括兩個整數,第乙個整數表示作業的完成期限,第二個數表示該作業的學分。

輸出輸出乙個整數表示可以獲得的最大學分。保證答案不超過c/c++的int範圍。

樣例輸入

複製樣例資料

71 6

1 73 2

3 12 4

2 56 1

樣例輸出

15提示

對於20%的資料,n≤103;

對於40%的資料,n≤104;

對於60%的資料,n≤105;

對於100%的資料,n≤106,作業的完成期限均小於7×105

思路分析:按照貪心策略來,一定會把學分高的放在前面,然後進行遍歷,能寫的科目就寫,最後得到的答案一定是最優解.但此題的問題是如何確定目前科目前是否還有空天並把它找出來,樓主之前是想用乙個標記陣列以及while(i–)挨個遍歷,沒錯,tle了…然後接觸了並查集這個玩意----另用乙個指向陣列並將乙個數指向它前乙個數,然後用函式呼叫,如果這個數是空就用它,否則就往前推直到找到下乙個空的數,再將標記指向它,下次在用它是就不用乙個個找了.

附**:

#include#includeusing namespace std;

typedef struct homework

homework;

int numb[(int)(1e6 + 5)]; //標記陣列

int before[(int)(1e6 + 5)]; //指向陣列(指向前面第乙個空天)

homework hw[(int)(1e6 + 5)];

int cmp(homework a, homework b)

int unon(int n)

}int main()

sort(hw+1, hw+1 + n, cmp); //將每門學科按照學分排序

memset(numb, 0, n * sizeof(int));

int sum = 0;

for (int i = 1; i <= n; i++)

}printf("%d\n", sum);

} return 0;

}

家庭作業 Standard IO

description 老師在開學第一天就把所有作業都布置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的。例如如果乙個作業學分為10,要求在6天內交,那麼要想拿到這10學分,就必須在第6天結束前交。每個作業的完成時間都是只有一天。例如,假設有7次作業的學分和完...

家庭作業彙總

家庭作業 2.65 寫出 實現如下函式 return 1 when x contains an even number of 1s 0 otherwise.assume w 32 int even ones unsigned x 函式應該遵循位級整數編碼規則,不過你可以假設資料型別int有w 32位...

家庭作業 紀中2549 貪心 優化

老師在開學第一天就把所有作業都布置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的。例如如果乙個作業學分為10,要求在6天內交,那麼要想拿到這10學分,就必須在第6天結束前交。每個作業的完成時間都是只有一天。例如,假設有7次作業的學分和完成時間如下 作業號 1 ...