P3619 魔法
Forever丶CIL · · 题解
对于这个题,我刚开始的想法是,先把加时间的魔法全做完,再把减时间的魔法做完,但是按什么顺序呢?
我草率的按减时间从小到大去做,后经证实显然是不对的。。。 比如说这组数据: 1 3 100 27 -19 91 -39 42 -5 就卡掉了我。
后经高人指点,知道了要按t+b从大到小排序,但是为什么呢?
我也希望有大佬给证一下。。。。
不过没关系,蒟蒻可以自己脑补脑补,首先,T越大,我们就越有可能完成任务。 所以,我们每做一个魔法,就要想着给后面留更多时间,我个人觉得 t+b大的魔法,要么是加的时间比较多,要么就是需要比较大的t,所以需要先做掉。。。
qwq
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int Maxn=300000;
int T,n,z;
struct Things
{
int t,b;
};
Things Th[Maxn];
inline int read()
{
int fl=1,rt=0; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') fl=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){rt=rt*10+ch-'0';ch=getchar();}
return fl*rt;
}
inline bool cmp(Things x,Things y)
{
return x.t+x.b>y.t+y.b;
}
inline void Greedy()
{
int now=1,si=0;
while(T>Th[now].t)
{
T+=Th[now].b; now++;
if(now>n&&T>0){si=1; break;}
}
(si)?printf("+1s\n"):printf("-1s\n");
}
void read_ini()
{
z=read();
while(z--)
{
n=read(); T=read();
for(int i=1;i<=n;i++) Th[i].t=read(),Th[i].b=read();
sort(Th+1,Th+1+n,cmp);
Greedy();
}
}
int main()
{
read_ini();
return 0;
}
/*
1
3 100
27 -19
91 -39
42 -5
*/
嗯,先把加时间的都做掉,后面的按t+b递减排肯定也可以。。。