P3619 魔法 洛谷 题解

魔法

题目描述

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

输入格式

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

对于每个测试点:

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

接下来 n 行,每行 2 个数字,tibi

输出格式

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

样例 #1

样例输入 #1

1
2 13
1 -9
5 -3

样例输出 #1

+1s

提示

对于 20% 的数据,n10

对于 100% 的数据,n105,Z10,ti105,T105,105bi105

By lantian

LATEX By ⚡炭治郎⚡

题目大意

给定一个时间T,要完成n个任务,每个任务两个量,一个是ti,一个是bi
ti是当T严格大于ti(tiT)时可以完成本任务 。

(注意!完成任务不消耗时间!)

bi是完成任务后所加的时间。
询问在T大于零的情况下能否能完成所有任务,能输出+1s,不能输出1s

思路

贪心,将任务分成两部分,一部分是bi>0的,另一部分是bi0的,如果是第一部分直接按照ti从小到大排序,然后进行模拟,有无法完成的就输出1s,如果是第二部分,按照bi+ti从大到小进行排序,为什么呢?看下面一组样例:

1
2 4
4 -1
3 -4

如果还按照第一种方式排序,会先完成最后一项任务,导致无法完成第一项任务而输出1s,但是本样例是输出+1s的,而按照bi+ti从大到小进行排序就可以避免出错。
最后由于要求T始终大于0,所以在模拟第二部分的数时加一个T是否大于0的特判,不满足就输出1s

CODE:

#include<bits/stdc++.h>
using namespace std;
struct node{
long long w,v;
}a[100001],b[100001];
int cmp(node x,node y){
return x.v<y.v;
}
int cmp1(node x,node y){
return x.w+x.v>y.w+y.v;
}
int idx,idy;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long tt,n,m;
cin>>tt;
while(tt--){
for(int i=1;i<=idx;i++){
a[i].w=0;
a[i].v=0;
}
for(int i=1;i<=idy;i++){
b[i].w=0;
b[i].v=0;
}
idx=0;
idy=0;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
if(y>0){
a[++idx].w=x;
a[idx].v=y;
}else{
b[++idy].w=x;
b[idy].v=y;
}
}
sort(a+1,a+idx+1,cmp);
sort(b+1,b+idy+1,cmp1);
int t=0;
for(int i=1;i<=idx;i++){
if(a[i].w>=m){
cout<<"-1s"<<"\n";
t=1;
break;
}else{
m+=a[i].v;
}
}
if(t){
continue;
}
for(int i=1;i<=idy;i++){
if(b[i].w>=m){
cout<<"-1s"<<"\n";
t=1;
break;
}else{
m+=b[i].v;
}
if(m<=0){
cout<<"-1s"<<"\n";
t=1;
break;
}
}
if(t){
continue;
}
cout<<"+1s"<<"\n";
}
return 0;
}

后记

最开始以为是道水题,结果码力不够打了好一会儿

posted @   lbh123  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示