題目描述
小偉報名參加**電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者 m 元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣布了比賽規則:
首先,比賽時間分為 n個時段,它又給出了很多小遊戲,每個小遊戲都必須在規定期限前完成。如果乙個遊戲沒能在規定期限 t 前完成,則要從獎勵費 m 元中扣去一部分錢 w,w 為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在乙個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!注意:比賽絕對不會讓參賽者賠錢!
輸入格式
輸入共四行。
第一行為 m,表示一開始獎勵給每位參賽者的錢;
第二行為 n,表示有 n 個小遊戲;
第三行有 n 個數,分別表示遊戲 1 到 n 的規定完成期限;
第四行有 n 個數,分別表示遊戲 1 到 n 不能在規定期限前完成的扣款數。
輸出格式
輸出僅一行,表示小偉能贏取最多的錢。
樣例樣例輸入
10000
74 2 4 3 1 4 6
70 60 50 40 30 20 10
樣例輸出
9950
資料範圍與提示
對於 100%所有資料,有 n ≤ 500,1 ≤ t ≤ n
分析
扣款數多的肯定要先完成,但如何避免把扣款數高的題目過早完成而導致本來能完成的題目完不成了呢?
因為扣款數多的要優先完成,所以我們根據扣款數對任務從大到小進行排序,然後從第乙個(扣款數最多的)任務開始,將他放到他能放到的最後期限去做,(目的是保證不出現前面所說的問題),排在後面可以為時間要求更高的任務留出時間。
**如下:
#include #include using namespace std;
typedef struct
goods;
int cmp(goods x,goods y)
int main()
,t; goods a[501];
cin >> all;
cin >> n;
for(i=1;i<=n;i++)
cin >> a[i].num;
for(i=1;i<=n;i++)
cin >> a[i].count;
sort(a+1,a+n+1,cmp);
// 核心**段
// **********
for(i=1;i<=n;i++)
}if(t == 0)
all -= a[i].count;
}// ************
cout << all << endl;
}
並查集演算法:時間上更優
#include #include #include const int maxn = 501;
using namespace std;
typedef struct
goods;
bool cmp(goods x,goods y)
int fa[maxn];
int getfa(int x)
int main()
sort(a+1,a+1+n,cmp);
for(i=1;i<=maxx;i++)
fa[i]=i;
for(i=1;i<=n;i++)
if(!j)
all -= a[i].c;
} cout << all;
}
智力大衝浪(貪心)
題目描述 小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的。接下來主持人宣布了比賽規則 首先,比賽時間分為n個時段 n 500 它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成 1 t...
貪心 智力大衝浪
貪心 智力大衝浪 時間限制 1 sec 記憶體限制 128 mb 小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?接下來主持人宣布了比賽規則 首先,比賽時間分為n個時段 n 500 它又給出了...
智力大衝浪
時間限制 1 sec 記憶體限制 128 mb 提交 112 解決 71 提交 狀態 討論版 小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?接下來主持人宣布了比賽規則 首先,比賽時間分為n個...