题目描述

cjwssb知道是误会之后,跟你道了歉。你为了逗笑他,准备和他一起开始魔法。不过你的时间不多了,但是更惨的是你还需要完成n个魔法任务。假设你当前的时间为T,每个任务需要有一定的限制ti表示只有当你的T严格大于ti时你才能完成这个任务,完成任务并不需要消耗时间。当你完成第i个任务时,你的时间T会加上bi,此时要保证T在任何时刻都大于0,那么请问你是否能完成这n个魔法任务,如果可以,输出+1s,如果不行,输出-1s。

输入输出格式

输入格式:

第一行:一个整数Z,表示有Z个测试点。

对于每个测试点

第一行:一个整数n,T,表示有n个任务,你一开始有T的时间。

接下来n行,每行2个数字,ti与bi

输出格式:

对于每个测试点,输出+1s或者-1s

输入输出样例

输入样例#1:

1
2 13
1 -9
5 -3
输出样例#1:

+1s

说明

对于20%的数据,n≤10

对于100%的数据,n≤100,000,Z≤10,ti,T≤100,000,−100,000≤bi≤100,000

By:lantian

观察样例后我们发现,竟然有负数!看起来只能大力贪心了!

大力贪心一番,我们发现我们可以先做所有bi为正的任务,这样我们所拥有的续命时间就会猛增,达到一个人生巅峰!

这部分可以先按ti递增排序,先满足条件的低的任务,步步走上人生巅峰。

bi为正的任务,我们就处理完了。

再来看bi为负的任务,想一想我们好像手足无措、无计可施。不妨考虑一些优雅的、有根据的贪心?

还记得国王游戏吗?那道题我们用到了微扰(邻值交换)的方法,这道题会不会也适用?

什么是微扰?粗糙的理解就是在局部情况下,我们交换两个变量组的值,这里只会改变局部的情况,而整体局面不变。交换后局部情况可能会变得更优或更差,于是我们就可以找出一种排序的根据,再进行贪心便有理有据。关键是交换前后局部情况改变,才能得到正确的关系。

//图片怎么旋转啊!!麻烦各位看官转个头qwq

code

 #include<cstdio>
#include<algorithm>
#include<utility> using namespace std; int T,ti,n,tot,cnt;
struct node{
int t,b;
}nega[];
struct Vergil{
int t,b;
}posi[]; bool cmp1(Vergil p,Vergil q)
{
return p.t<q.t;
} bool cmp2(node p,node q)
{
return p.t+p.b>q.t+q.b;
} void clear()
{
for(int i=;i<=cnt;i++) nega[i].t=,nega[i].b=;
for(int i=;i<=tot;i++) posi[i].t=,posi[i].b=;
cnt=,tot=;
} int main()
{
scanf("%d",&T);
while(T--)
{
clear();
bool flag=false;
scanf("%d%d",&n,&ti);
for(int i=;i<=n;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
if(y>) posi[++tot].t=x,posi[tot].b=y;
else nega[++cnt].t=x,nega[cnt].b=y;
}
sort(posi+,posi+tot+,cmp1); for(int i=;i<=tot;i++)
{
if(ti<=posi[i].t)
{
printf("-1s\n");
flag=true;
break;
}
ti+=posi[i].b;
if(ti<=)
{
printf("-1s\n");
flag=true;
break;
}
}
if(flag) continue; sort(nega+,nega+cnt+,cmp2);
for(int i=;i<=cnt;i++)
{
if(ti<=nega[i].t)
{
printf("-1s\n");
flag=true;
break;
}
ti+=nega[i].b;
if(ti<=)
{
printf("-1s\n");
flag=true;
break;
}
}
if(flag) continue;
printf("+1s\n");
}
return ;
}

注意是严格大于!在这被坑了qwq

Luogu P3619 魔法 【贪心/微扰证明】的更多相关文章

  1. NOIP2012BLOCKADE贪心思想证明

    NOIP2012BLOCKADE贪心思想证明 这道题的做法是二分时间并检验这个时间是否可行.检验的方法要用到贪心思想. 对于不能到根结点的军队应该尽量向根结点走. 如果军队A能走到根结点但到根结点后剩 ...

  2. [HNOI2015]菜肴制作贪心的证明

    [HNOI2015]菜肴制作贪心的证明 先吐槽一句为什么网上都没人证这个东西,我觉得一点也不显然啊... 判环不用说了,现在处理一个DAG.考虑按题意模拟:建反图(边从后选的点连向先选的点),每次找全 ...

  3. Knapsack I 竟然是贪心,证明啊。。。。

    Knapsack I Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

  4. Luogu 1583 - 魔法照片 - [简单排序题]

    题目链接:https://www.luogu.org/problemnew/show/P1583 题目描述一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人. ...

  5. luogu P2672 推销员 |贪心

    题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第ii家住户到入口的距离为Si米.由于同一栋 ...

  6. luogu P1650 田忌赛马 |贪心

    题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这里取得200银币. ...

  7. Luogu P1583 魔法照片

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  8. P3619 魔法

    考虑两个任务 \(1\) 和 \(2\),当前时间为 \(T\),两个任务都要完成. 先完成任务 \(1\) 的条件是 \(T>t_1\) 且 \(T+b_1>t_2\),先完成任务 \( ...

  9. BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]

    吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会, 死磕了很长时间,不想想了,结果码代码又不会码.. 深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了 以下可能是个人 ...

随机推荐

  1. Log4j的日志级别分析(转)

    说明:Log4j的日志是有级别的,从低到高顺序为:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF,当定义了日志级别为 ...

  2. Java描述符(修饰符)的类型

    以下内容引用自http://wiki.jikexueyuan.com/project/java/modifier-types.html: 描述符(修饰符)是添加到那些定义中来改变他们的意思的关键词.J ...

  3. Docker+Drone做Java/Tomcat的CI服务

    1. 安装Docker(略过) 2. 编写docker-compose.yaml version: '2' services: drone-server: image: drone/drone:0.8 ...

  4. 使用Python实现一个简单的项目监控

    在公司里做的一个接口系统,主要是对接第三方的系统接口,所以,这个系统里会和很多其他公司的项目交互.随之而来一个很蛋疼的问题,这么多公司的接口,不同公司接口的稳定性差别很大,访问量大的时候,有的不怎么行 ...

  5. DacningLinks实现

    本文简单分析DancingLinks实现中的数据结构设计,给出了精确覆盖问题及其扩展问题的代码.并应用于数独问题. 先简单描写叙述一下精确覆盖问题: 给定一个N*M的01矩阵,从中选中若干行,这些行向 ...

  6. CMMI 2,3,4,5级涉及的过程域(PA)介绍

      CMMI中的PA即Process Area的缩写,中文称为过程域.简单的说就是做好一个事情需要的某一个方面,对于软件开发来说,就是做好软件开发需要的某一个方面. CMMI2.3级共有18个过程域( ...

  7. pat(A)1041. Be Unique(哈希)

    1.链接:点击打开链接 2.代码: #include<cstdio> #include<iostream> #include<cstring> using name ...

  8. PHP出现Warning: A non-numeric value encountered问题的原因及解决方法

    本文介绍php出现Warning: A non-numeric value encountered问题,用实例分析出现这种错误的原因,并提供避免及解决问题的方法. <?php error_rep ...

  9. 两个喜欢的"新"C#语法

    现在C#比较新的语法,我都十分喜欢. 比如属性可设默认值: public string Name { get; set; } = "张三"; 还有一个就是拼接字符串. 以往,通常都 ...

  10. DRF的认证,频率,权限

    1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...