72分萌新求助
查看原帖
72分萌新求助
531258
Fishmaster楼主2022/4/29 14:12

rt。用了个玄学贪心骗了 7272 分(对了三个点) qwq……

大致是分类讨论前两道菜的价格情况,再贪心选择后面的菜。

不知道贪心是不是对的,就随便乱打了,如果正解不是贪心的话帮帮这个蒟蒻吧 qwq

冗长的代码 qwq:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
    ll a,b,id;
}A[500005],B[500005];
ll n,ans1[500005],ans2[500005];
bool cmp1(node x,node y){
    if(x.a==y.a)return x.b>y.b;
    return x.a<y.a;
}
bool cmp2(node x,node y){
    if(x.b==y.b)return x.a>y.a;
    return x.b<y.b;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>A[i].a>>A[i].b;
        A[i].id=i;
        B[i].a=A[i].a,B[i].b=A[i].b,B[i].id=A[i].id;
    }
    sort(A+1,A+1+n,cmp1);
    sort(B+1,B+1+n,cmp2);
    cout<<A[1].a<<endl;
    if(A[1].id!=B[1].id){
        cout<<A[1].a+B[1].b<<endl;
        ll ans=A[1].a+B[1].b;
        for(int i=2;i<=n;i++){
            if(B[i].id!=A[1].id){
                ans+=B[i].b;
                cout<<ans<<endl;
            }
        }
    }else{
        ans1[2]=A[1].a+B[2].b;
        ans2[2]=A[2].a+B[1].b;
        ll cnt1=2,cnt2=2,sum1=ans1[2],sum2=ans2[2];
        for(int i=1;i<=n;i++){
            if(B[i].id!=A[1].id&&B[i].id!=B[2].id){
                sum1+=B[i].b;
                ans1[++cnt1]=sum1;
            }
        }
        for(int i=1;i<=n;i++){
            if(B[i].id!=A[2].id&&B[i].id!=B[1].id){
                sum2+=B[i].b;
                ans2[++cnt2]=sum2;
            }
        }
        for(int i=2;i<=n;i++)cout<<min(ans1[i],ans2[i])<<endl;
    }
    return 0;
}
2022/4/29 14:12
加载中...