u202 家庭作業

2021-09-28 10:07:29 字數 2398 閱讀 9637

time limit: 1 second

memory limit: 128 mb

老師在開學第一天就把所有作業都布置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的

。例如如果乙個作業學分為10,要求在6天內交,那麼要想拿到這10學分,就必須在第6天結束前交。

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

作業號 1 2 3 4 5 6 7

期限 1 1 3 3 2 2 6 

學分 6 7 2 1 4 5 1 

最多可以獲得15學分,其中乙個完成作業的次序為2,6,3,1,7,5,4,注意可能還有其他方法。

你的任務就是找到乙個完成作業的順序獲得最大學分。 

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

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

對於所有資料,n<=1000000,作業的完成期限均小於700000。 對於部分資料,n<=1000; 對於部分資料,n<=10000; 對於部分資料,n<=100000; 對於部分資料,作業的完成期限小於100; 對於部分資料,作業的完成期限小於1000;

7

1 61 7

3 23 1

2 42 5

6 1

15
【題解1】

按照期限。從大到小排序。設定乙個變數maxtime,表示當前在安排哪一天的作業。一開始maxtime為所有的作業最大期限。如果遇到有a[i].deadline==maxtime,則把這些a[i]加入到大根堆中。然後為maxtime分配乙個作業。然後maxtime遞減,再為遞減後的maxtime分配乙個作業。這樣做的意義在於。排除掉了當前的日期超過了最後期限的問題。我們處理的作業都是可以在當前列舉的日子做的作業。而我們給其選乙個最優值->最大值。

難點就只在堆操作上了。

一開始的排序可以改為鏈式儲存。最大為70萬。

【**1】

#include #include using namespace std;

int n;

struct data

;data a[1000009];

int dui[1000009],size = 0,pos,ans = 0;

void input_data()

int cmp(const data &a,const data &b) //這是sort函式的比較函式 按照最後時限從小到大排序

void up_adjust(int p) //把在p位置上的數試著往上調整

else //不需要調整了 則結束。

break;

} dui[i] = x;

pos = i;//可能還要往下調整,所以記錄其放在了**。

}void down_adjust(int p) //把在堆中p位置上的數字往下調整。

else

break;

} dui[i] = x; //把x賦值到恰當的位置

}void get_ans()

if (size > 0) //如果堆中還有元素。就把它放在今天完成

maxtime--;

if (maxtime == 0) //如果已經列舉完天數則結束。

break;

}}void output_ans()

int main()

【題解2】

與思路一有點不同。我們把作業按照分數從大到小排序。然後按分數從大到小的順序給它們分配乙個合適的位置。即在deadline和它之前的位置找乙個最近的。這樣得到的效果和題解1類似。可以想一下。所有的作業,必然都會在某乙個maxtime被全部加入。那

一瞬間,我們要獲得其最大值。然後放在maxtime的位置。而我們這樣做。正是保證了最大值都能找到乙個合適的位置。找到這樣乙個位置,需要用到並查集。

【**2】

#include #include #include using namespace std;

int f[700001],n,max_deadline = 0,ans =0 ; //最大期限,用來初始化並查集。

struct zuoye //這個結構體。用來記錄每個作業的資訊。

;zuoye a[1000001];

void input_data()

}int cmp(const zuoye &a,const zuoye &b) //sort函式的比較函式。

int findfather(int x) //這是並查集的找根節點函式

void get_ans()

}}void output_ans()

int main()

AT1251 家庭菜園

注意!1 h 和 h n 是可以有等於 h i 的,翻譯錯了 洛谷傳送門 at傳送門 為什麼會有兩個 考慮最後能夠獲得收入的位置,這些位置構成乙個先上公升再下降的序列。那麼我們可以列舉那個最高點,然後算出這個點左邊遞增的最大收入和右邊遞減的最大收入。那麼只考慮左邊,右邊同理即可。我們設 f i 表示...

1362 家庭問題 family

1 include2 using namespace std 3int n,k 按要求輸入 4int a,b 按要求輸入 5int rel 105 105 用於儲存各個成員之間的關係 6int vis 105 記錄是否被訪問過 7int que 10010 定義佇列 8int f,r 定義隊首隊尾 ...

L2 007 家庭房產

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數 人均房產面積及房產套數。輸入格式 輸入第一行給出乙個正整數n 1000 隨後n行,每行按下列格式給出乙個人的房產 編號 父 母 k 孩子1 孩子k 房產套數 總面積 其中 編號 是每個人獨有的乙個4位數的編號 父 和 母 分別是該編...