5 条题解
-
-10
家人们,我是 xixisuper。贪心。我们把怪物分为两种:净扣咱血的和净回咱血的(包括不扣的)。
我们容易发现净回血的怪我们最开始全把它们打了是不劣的,我们将这部分怪按照 为关键字从小到大打掉,如果打不掉就无解。以上是显然的,我们考虑如何弄那些净扣血的,显而易见,我们应该以 为关键字从大到小排序怪物即可,因为扣血和回血的总量是固定的,为了尽量不浪费回血我们应该保证最后一个怪的回血最少减少浪费,以此类推往上从大到小即可了。
题解简陋请见谅毕竟:
讲的越模糊,讲得越好。——w*****g
代码:
#include <iostream> #include <algorithm> #include <vector> #define ll long long using namespace std; const ll N=1e5+5; ll n,s; struct node{ ll a,b,id; friend bool operator < (const node a,const node b){ if(a.b==b.b) return a.a<b.a; return a.b>b.b; } }a[N]; ll ans[N],idx; vector<node> q1,q2; inline bool cmp(node a,node b){return a.a<b.a;} int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>s; for(ll i=1;i<=n;i++){ cin>>a[i].a>>a[i].b; a[i].id=i; if(a[i].a<=a[i].b) q1.push_back(a[i]); else q2.push_back(a[i]); } sort(q1.begin(),q1.end(),cmp); sort(q2.begin(),q2.end()); for(auto x:q1){ if(x.a>=s){cout<<-1;return 0;} s-=x.a;s+=x.b; ans[++idx]=x.id; } for(auto x:q2){ if(x.a>=s){cout<<-1;return 0;} s-=x.a;s+=x.b; ans[++idx]=x.id; } for(ll i=1;i<=idx;i++) cout<<ans[i]<<' '; return 0; }
信息
- ID
- 39
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 160
- 已通过
- 32
- 上传者