智力大冲浪-贪心
智力大沖浪(riddl)
問題
小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣布了比賽規則:
首
先,比賽時間分為n個時段(n≤500),它又給出了很多小游戲,每個小游戲都必須在規定期限ti
前完成(1≤ti≤n)。如果一個游戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢wi,wi為自然數,不同的游戲扣去的錢是不一樣的。當然,
每個游戲本身都很簡單,保證每個參賽者都能再一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做游戲的順序。作為參
賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!注意:比賽絕對不會讓參賽者賠錢。
輸入
共4行:
第1行為m,表示一開始獎勵給每位參賽者的錢;
第2行為n,表示有n個小游戲;
第3行有n個數,分別表示游戲1到n的規定完成期限;
第4行有n個數,分別表示游戲1到n不能在規定期限前完成的扣款數。
輸出
僅1行,表示小偉能贏取最多的錢。
樣例輸入
10000 7 4 2 4 3 1 4 6 70 60 50 40 30 20 10
樣例輸出
9950
解析
我們可以按金錢的多少排序,我們可以把游戲在規定期限的順序,并用數組記錄,如果該規定期限有游戲存在,我們可以把它放在前面一個空著的(直到1~t內全部占滿)。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 502;
struct times {
int a, b;
};
bool cmp(times a, times b) {
if(a.b == b.b) {
return a.a < b.a;
}
return a.b > b.b;
}
int main() {
int n, sum, a[maxn];
times s[maxn];
scanf("%d%d", &sum, &n);
for(int i = 0; i < n; i++) {
a[i] = -1;
scanf("%d", &s[i].a);
s[i].a -= 1;
}
for(int i = 0; i < n; i++) {
scanf("%d", &s[i].b);
}
sort(s, s+n, cmp);
int sum1 = 0;
for(int i = 0; i < n; i++) {
int m = s[i].a;
while(m >= 0) {
if(a[m] == -1) {
a[m] = i;
break;
} else if(m > 0) {
m--;
} else if(m == 0) {
sum1 += s[i].b;
break;
}
}
}
printf("%d
",sum - sum1);
}
View Code
總結
- 上一篇: 分区partition是否只保存一部分数
- 下一篇: mysql8出现1045报错+常用的加密