其他分享
首页 > 其他分享> > 【NKOJ-1400】【分类练习3.贪心】智力大冲浪

【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