【NKOJ-1400】【分类练习3.贪心】智力大冲浪
作者:互联网
问题描述
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者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
#include <bits/stdc++.h>//用万能头文件省事
using namespace std;
struct node{
int a,b;// 结构体内变量初始化(时间和罚款金额)
}s[505];//结构体,方便储存数据
bool cmp(node a,node b){
return a.b>b.b;//为后面排序,将罚款多的排在前面
}
int main(){
int n,sum,a[505];//定义原本金额、游戏个数、时间的占用情况
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;//定义被罚款的金额,初始化为0
for(int i=0;i<n;i++){
int m=s[i].a;//将m初始化为该游戏的时间
while(m>=0){//循环判断
if(a[m]==-1){//若此时间没被占领,那么标记后跳出循环
a[m] = 1;//重点,保证一个游戏只占领一个时间
break;//占领后立刻结束循环。
} else if(m>0){//如果被占领了,那么向前一步判断
m--;//就将时间向前移一位
} else if(m==0){//如果已经没有时间了,那么放弃这个游戏
sum1+=s[i].b;//将罚款的额数相加
break;//跳出循环
}
}
}
printf("%d",sum-sum1);//用本来的金额减去罚款的金额,就是最后的答案
return 0;//停止程序
}
标签:node,游戏,int,NKOJ,参赛者,小游戏,1400,sum,贪心 来源: https://blog.csdn.net/huangyucheng123/article/details/122635245