欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > gesp(C++五级)(4)洛谷:B3872:[GESP202309 五级] 巧夺大奖

gesp(C++五级)(4)洛谷:B3872:[GESP202309 五级] 巧夺大奖

2025/9/27 11:32:12 来源:https://blog.csdn.net/weixin_66461496/article/details/145128846  浏览:    关键词:gesp(C++五级)(4)洛谷:B3872:[GESP202309 五级] 巧夺大奖

gesp(C++五级)(4)洛谷:B3872:[GESP202309 五级] 巧夺大奖

在这里插入图片描述

题目描述

小明参加了一个巧夺大奖的游戏节目。主持人宣布了游戏规则:

  1. 游戏分为 n n n 个时间段,参加者每个时间段可以选择一个小游戏。

  2. 游戏中共有 n n n 个小游戏可供选择。

  3. 每个小游戏有规定的时限和奖励。对于第 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 1n500

输入第二行,包含 n n n 个正整数。第 i i i 个正整数为 T i T_i Ti,即第 i i i 个小游戏的完成期限。约定 1 ≤ T i ≤ n 1\le T_i\le n 1Tin

输入第三行,包含 n n n 个正整数。第 i i i 个正整数为 R i R_i Ri,即第 i i i 个小游戏的完成奖励。约定 1 ≤ R i ≤ 1000 1\le R_i\le 1000 1Ri1000

输出格式

输出一行,包含一个正整数 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;
} 

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词