题目描述

小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:

首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!

输入输出格式

输入格式:

输入文件riddle.in,共4行。

第1行为m,表示一开始奖励给每位参赛者的钱;

第2行为n,表示有n个小游戏;

第3行有n个数,分别表示游戏1到n的规定完成期限;

第4行有n个数,分别表示游戏1到n不能在规定期限前完成的扣款数。

输出格式:

输出文件riddle.out,仅1行。表示小伟能赢取最多的钱。

输入输出样例

输入样例:

10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
输出样例:

9950
注:完成第一、二、三、四、六个任务得到最多钱。 这是一道贪心题,我们可以对于每个时段,保证扣得钱数最少。 对于样例,我们分别对游戏编号:
①. 4 70
②. 2 60
③. 4 50
④. 3 40
⑤. 1 30
⑥. 4 20
⑦. 6 10
其中第一列为编号,第二列为规定期限ti,第三列为未完成的赔钱。 显然,对于第一个时段,我们最优解是完成第五个游戏,这样赔钱数为0,已完成游戏⑤。
对于第二个时间段,我们最优解是完成第二个游戏,这样赔钱数还是为0,已完成游戏⑤②。
对于第三个时间段同理已完成⑤②④。
对于第四个时间段,游戏①我们肯定是要选的,因为它赔钱数最多,剩下的③⑥加起来会赔70元,但在这里,我们注意到,我们已完成的游戏里面⑤的赔钱数是30,但③的赔钱数是50,如果我们完成③放弃⑤,赔钱数只是50比之前优,而这个③我们就可以放在第一个时间段去完成
剩下的⑥所赔的钱都比已完成的少,就也放弃了。
第五个时间段,我们就只能完成⑦了。 在第四个时间段里,我们之所以能交换已完成的游戏和待完成的游戏是因为我们是根据规定期限从小到大排序的,这样后来完成的游戏肯定能在先前完成。
并且对于每个时段我们都保证了当前赔钱数最低,所以到了最后赔钱数也自然最低。 所以我们就把已完成的游戏的最小赔钱数和这个时段必须完成的最大赔钱数比较,如果小于则交换即可。
我们要用堆来维护已完成游戏的最小赔钱数,并对游戏按照期限进行排序。
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int> qwq; //已完成游戏的堆
int n,len;
long long m;
struct data{
int t,w; //t为期限,w为赔钱数
}game[];
bool comp(const struct data &a,const struct data &b){
if (a.t<b.t) return ;
if (a.t>b.t) return ;
if (a.t==b.t) return (a.w>b.w);
}
void work(int x){
qwq.push(-game[len].w); //负号即转化为小根堆
len++;
if (x<game[len].t) return; //这个游戏不是这个时段必须完成的话就退出
while (game[len].t==x){
int a=-qwq.top(); //开始比较已完成游戏最小赔钱数与要完成的游戏的赔钱数
if (a<game[len].w){
qwq.pop();
qwq.push(-game[len].w);
len++;
}
else {len++;return;}
}
return;
}
int main(){
cin>>m>>n;
long long all=;
for (int i=;i<=n;i++)
cin>>game[i].t;
for (int i=;i<=n;i++){
cin>>game[i].w;
all+=game[i].w;
}
len=;
sort(game+,game++n,comp);
for (int i=;i<=n;i++)
work(i);
long long ans=;
while (qwq.size()){
ans+=-qwq.top(); //ans为已完成的赔钱数
qwq.pop();
}
cout<<m-(all-ans)<<endl;
return ;
}

surf


智力大冲浪(洛谷P1230)的更多相关文章

  1. P1230 智力大冲浪 洛谷

    https://www.luogu.org/problem/show?pid=1230 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每 ...

  2. 洛谷 P1230 智力大冲浪

    洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...

  3. 洛谷 P1230 智力大冲浪 题解

    P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者 \(m\)元.先不要太高兴!因为这些钱还不一定都是你的 ...

  4. 洛谷P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  5. P1230 智力大冲浪(洛谷)

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  6. C++ 洛谷P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  7. 洛谷P1230智力大冲浪 题解

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  8. P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  9. 智力大冲浪(riddle)

    智力大冲浪(riddle) 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接 ...

随机推荐

  1. mysql union和union all 的差别以及使用

    Union由于要进行反复值扫描,所以效率低.假设合并没有刻意要删除反复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样.并且字段类型要"相容"(一致). ...

  2. iOS触摸事件哦

    主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在视图的层次结构里找到能响应消息的那个视图.(2)然后在找到的视图里处理消息 ...

  3. MBProgressHUD 设置透明背景

    MBProgressHUD 默认使用MBProgressHUDBackgroundStyleBlur 类型 MBProgressHUDBackgroundStyleBlur使用了毛玻璃效果 ,我们要把 ...

  4. 使用jq Deferred防止代码被回调函数分解分解的支离破碎

    //移动人物 function moveInterval(stopPosotion){ var dtd = $.Deferred(); // 生成Deferred对象 var yidong= wind ...

  5. 转:浅析VO、DTO、DO、PO的概念、区别和用处

    原文链接 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对象,这个概 ...

  6. unity, GetComponent<MeshRenderer>().sharedMaterial 与 GetComponent<MeshRenderer>().material

    我多个物体用的是同一个material,当我用gameObject.GetComponent<MeshRenderer>().sharedMaterial.SetColor("_ ...

  7. C#反射取数组单个元素的类型

    去bing上查了一下,果然有和我一样蛋疼的朋友,他们在论坛研究了半天,最后还是暴力解决: public Type GetArrayElementType(Type t) { string tName ...

  8. ATITIT.翻译模块的设计与实现 api attilax 总结

    ATITIT.翻译模块的设计与实现 api attilax 总结 1. 翻译原理1 2. TMX格式是国际通用格式(xml)1 2.1. 方法/步骤2 3. TRADOS2 4. ATITIT.翻译软 ...

  9. c中头文件在cpp文件里引用和.h文件引用的思考

    我们在编敲代码中头文件是常常使用的. 可是头文件是应该包括在.H文件里还是在.cpp文件里.在这个其中有什么样去差别呢. 假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a. ...

  10. java printf long

    System.out.printf("%d\n", 1000000000000000000L);