魔法
题目描述
cjwssb 知道是误会之后,跟你道了歉。你为了逗笑他,准备和他一起开始魔法。不过你的时间不多了,但是更惨的是你还需要完成 \(n\) 个魔法任务。假设你当前的时间为 \(T\),每个任务需要有一定的限制 \(t_i\) 表示只有当你的 \(T\) 严格大于 \(t_i\) 时你才能完成这个任务,完成任务并不需要消耗时间。当你完成第 \(i\) 个任务时,你的时间 \(T\) 会加上 \(b_i\),此时要保证 \(T\) 在任何时刻都大于 \(0\),那么请问你是否能完成这 \(n\) 个魔法任务,如果可以,输出 \(\texttt{+1}\texttt{s}\),如果不行,输出 \(\texttt{-1}\texttt{s}\)。
输入格式
第一行:一个整数 \(Z\),表示有 \(Z\) 个测试点。
对于每个测试点:
第一行:两个整数 \(n,T\),表示有 \(n\) 个任务,你一开始有 \(T\) 的时间。
接下来 \(n\) 行,每行 \(2\) 个数字,\(t_i\) 与 \(b_i\)。
输出格式
对于每个测试点,输出 \(\texttt{+1}\texttt{s}\) 或者 \(\texttt{-1}\texttt{s}\)。
样例 #1
样例输入 #1
1
2 13
1 -9
5 -3
样例输出 #1
+1s
提示
对于 \(20\%\) 的数据,\(n\leq10\);
对于 \(100\%\) 的数据,\(n\leq10^5,Z\leq10,t_i\leq10^5,T\leq10^5,-10^5\leq b_i\leq 10^5\)。
By lantian
\(\LaTeX\) By ⚡炭治郎⚡
题目大意
给定一个时间\(T\),要完成\(n\)个任务,每个任务两个量,一个是\(t_i\),一个是\(b_i\)。
\(t_i\)是当\(T\)严格大于\(t_i(\)即\(t_i\leq T)\)时可以完成本任务 。
\((\)注意!完成任务不消耗时间!\()\)。
\(b_i\)是完成任务后所加的时间。
询问在\(T\)大于零的情况下能否能完成所有任务,能输出\(+1s\),不能输出\(-1s\)。
思路
贪心,将任务分成两部分,一部分是\(b_i>0\)的,另一部分是\(b_i\leq0\)的,如果是第一部分直接按照\(t_i\)从小到大排序,然后进行模拟,有无法完成的就输出\(-1s\),如果是第二部分,按照\(b_i+t_i\)从大到小进行排序,为什么呢?看下面一组样例:
1
2 4
4 -1
3 -4
如果还按照第一种方式排序,会先完成最后一项任务,导致无法完成第一项任务而输出\(-1s\),但是本样例是输出\(+1s\)的,而按照\(b_i+t_i\)从大到小进行排序就可以避免出错。
最后由于要求\(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;
}
后记
最开始以为是道水题,结果码力不够打了好一会儿