gespC4B3872GESP202309___0">gesp(C++五级)(4)洛谷:B3872:[GESP202309 五级] 巧夺大奖
题目描述
小明参加了一个巧夺大奖的游戏节目。主持人宣布了游戏规则:
-
游戏分为 n n n 个时间段,参加者每个时间段可以选择一个小游戏。
-
游戏中共有 n n n 个小游戏可供选择。
-
每个小游戏有规定的时限和奖励。对于第 i i i 个小游戏,参加者必须在第 T i T_i Ti 个时间段结束前完成才能得到奖励 R i R_i Ri。
小明发现,这些小游戏都很简单,不管选择哪个小游戏,他都能在一个时间段内完成。关键问题在于,如何安排每个时间段分别选择哪个小游戏,才能使得总奖励最高?
输入格式
输入第一行,包含一个正整数 n n n。 n n n 既是游戏时间段的个数,也是小游戏的个数。约定 1 ≤ n ≤ 500 1\le n\le500 1≤n≤500。
输入第二行,包含 n n n 个正整数。第 i i i 个正整数为 T i T_i Ti,即第 i i i 个小游戏的完成期限。约定 1 ≤ T i ≤ n 1\le T_i\le n 1≤Ti≤n。
输入第三行,包含 n n n 个正整数。第 i i i 个正整数为 R i R_i Ri,即第 i i i 个小游戏的完成奖励。约定 1 ≤ R i ≤ 1000 1\le R_i\le 1000 1≤Ri≤1000。
输出格式
输出一行,包含一个正整数 C C C,为最高可获得的奖励。
样例 #1
样例输入 #1
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
样例输出 #1
230
提示
样例解释 1
7 7 7 个时间段可分别安排完成第 4、2、3、1、6、7、5 个小游戏,其中第 4、2、3、1、7 个小游戏在期限内完成。因此,可以获得总计 40 + 60 + 50 + 70 + 10 = 230 40+60+50+70+10=230 40+60+50+70+10=230 的奖励。
AC代码(100分)
#include<bits/stdc++.h>
using namespace std;
/*贪心思路:1、游戏按奖励降序排序2、对于每个游戏,从其截止时间向前寻找第一个空闲的时间进行安排
*/
int n,t[510],r[510],c=0;
bool vis[510]; //用于标记这个时间段是否已经被安排
//结构体
struct game{int t;//完成期限int r;//完成奖励
}a[510];//结构体数组
//排序规则函数
bool cmp(game g1,game g2){return g1.r>g2.r;
}
int main(){//输入 cin>>n;for(int i=1;i<=n;i++) cin>>a[i].t;for(int i=1;i<=n;i++) cin>>a[i].r;//排序sort(a+1,a+n+1,cmp); //安排游戏,计算最大可获得的奖励for(int i=1;i<=n;i++){//枚举所有游戏 for(int j=a[i].t;j>=1;j--){//从这个游戏的截止时间往前枚举 if(vis[j]==false){//找到第一个没有被安排的时间段 vis[j]=true;//这个时间段安排这个游戏后,标记此时间段 c+=a[i].r;//加上奖励 break;//找到第一个即停止查找 }}} //输出答案cout<<c; return 0;
}
文末彩蛋:
点击王老师青少年编程主页有更多精彩内容