(stable_sort稳定排序)阿罗拉联盟赛

题目链接

思路:直接模拟即可,需要注意,排序要用stable_sort()

#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<unordered_map>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<bitset>
#define ll long long
#define inf 0x3f3f3f3f
#define bug(a) cout<<"* "<<a<<endl;
#define bugg(a,b) cout<<"* "<<a<<" "<<b<<endl;
#define buggg(a,b,c) cout<<"* "<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
typedef pair<ll,ll> P;
const int N=1e5+10;
const ll mod=1e9+7;

int n,a[N],b[N],c[N],d[N],Ax[N],Bx[N];
ll sum1,sum2,ans1,ans2;

struct node{
    int gj,xl,zh;
}va[N],vb[N];
bool cmp1(node x,node y){
    return x.zh>y.zh;
}

bool cmp2(node x,node y){
    return x.zh<y.zh;
}

int main()
{
    cin>>n;
    char X;
    cin>>X;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&b[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&c[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&d[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&Ax[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&Bx[i]);

    vector<node> va,vb;
    for(int i=0;i<n;i++){
        va.push_back({a[i],b[i],a[i]+b[i]});
        vb.push_back({c[i],d[i],c[i]+d[i]});
    }
    stable_sort(va.begin(),va.end(),cmp1);//用稳定排序stable_sort(),大小相同时不改变初始顺序
    stable_sort(vb.begin(),vb.end(),cmp2);

    int p1=0,p2=0;
    int cnt1=Ax[p1],cnt2=Bx[p2];
    node pa,pb;
    while(ans1<n&&ans2<n){

        if(X=='A'){
            vb[cnt2-1].xl-=va[cnt1-1].gj;
            sum1+=va[cnt1-1].gj;
            cout<<"A"<<" "<<va[cnt1-1].gj<<endl;
            if(vb[cnt2-1].xl<=0){
                ans2++;
                p2++;
                cnt2=Bx[p2];
            }
            X='B';

        }
        if(X=='B'){
            va[cnt1-1].xl-=vb[cnt2-1].gj;
            sum2+=vb[cnt2-1].gj;
            cout<<"B"<<" "<<vb[cnt2-1].gj<<endl;
            if(va[cnt1-1].xl<=0){
                ans1++;
                p1++;
                cnt1=Ax[p1];
            }
            X='A';
        }
    }
    printf("%lld %lld %lld %lld\n",sum1,sum2,ans1,ans2);
    return 0;
}
/*
2
B
1 2
1 1
1 3
3 1
1 2
1 2
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值