首页 > 其他 > 详细

P3619 魔法

时间:2019-11-03 18:11:01      阅读:69      评论:0      收藏:0      [点我收藏+]

题目背景

http://baike.baidu.com/link?url=7tOqn6wVEwR6CB61TcpypU23obcxnhOX4HNkyMtV57pBZ8_8tXRQARdLAJ_OPmvoGwBPvpeT9l-vgMGqFoaBRD1PDF74WWcWanNHkJZ6HMnkIhmiXgpmyloUeRZ_AE3A

题目描述

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

思路

贪心再加上结构体排序,以耗时少中加的最多为优先排。

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=100010;

int z,n,t;
int num,cnt;

struct no {
	int b,t;
} a[N],f[N];

bool cmp(no a,no b) {
	return a.t<b.t;
}

bool cmp1(no a,no b) {
	return a.t+a.b>b.t+b.b;
}

int main () {
	scanf("%d",&z);
	while(z--) {
		num=cnt=0;
		bool flag=false;
		scanf("%d%d",&n,&t);
		for(int i=1,x,y; i<=n; i++) {
			scanf("%d%d",&x,&y);
			if(y>0) {
				a[++cnt].t=x;
				a[cnt].b=y;
			} else {
				f[++num].t=x;
				f[num].b=y;
			}
		}
		sort(a+1,a+1+cnt,cmp);
		sort(f+1,f+1+num,cmp1);
		for(int i=1; i<=cnt; i++)
			if(t>a[i].t)
				t+=a[i].b;
			else {
				flag=true;
				break;
			}
		for(int i=1; i<=num; i++) {
			if(t>f[i].t)
				t+=f[i].b;
			else {
				flag=true;
				break;
			}
			if(t<=0) {
				flag=true;
				break;
			}
		}
		if(!flag)
			printf("+1s\n");
		else
			printf("-1s\n");
	}
	return 0;
}

 

P3619 魔法

原文:https://www.cnblogs.com/mysh/p/11787775.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!