5 条题解

  • -10
    @ 2025-2-24 17:14:59

    家人们,我是 xixisuper。

    贪心。我们把怪物分为两种:净扣咱血的和净回咱血的(包括不扣的)。

    我们容易发现净回血的怪我们最开始全把它们打了是不劣的,我们将这部分怪按照 aia_i 为关键字从小到大打掉,如果打不掉就无解。以上是显然的,我们考虑如何弄那些净扣血的,显而易见,我们应该以 bib_i 为关键字从大到小排序怪物即可,因为扣血和回血的总量是固定的,为了尽量不浪费回血我们应该保证最后一个怪的回血最少减少浪费,以此类推往上从大到小即可了。

    题解简陋请见谅毕竟:

    讲的越模糊,讲得越好。——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
上传者