链接:https://ac.nowcoder.com/acm/contest/3003/F
来源:牛客网

图片说明

为了分差大,思路为,自己拿的分尽量高,对方拿的分尽量低。
考虑如下:
M1 1,10000;
M2 1000,998;
M3 5003,5002;
我们要先拿M3,原因如下:
假设牛牛牛可乐两人都拿了所有的物品,他们的分为Pipixia1,Pipixia2
那么开始拿物品后,如果牛牛拿了物品M3,那么就是牛牛保住自己M3的5003分,牛可乐失去自己的5002分
那么这样拿了一个,实际上有效果的反向分差为5003+5002=10005>M1的10001
所以,先拿的就是总分权重最大的。
算法上用结构体标号,快排调用一下即可
参考代码如下:

#include <bits/stdc++.h>
using namespace std;
long long int a[200005],b[200005];
struct pipixia{
    long long int m,id;
}x[200005];
int comp(const void *p,const void *q)//那啥,皮皮虾天下第一
{return (*(pipixia*)p).m<(*(pipixia*)q).m?1:-1;}
int main(int argc, char const *argv[])
{
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) scanf("%lld",&a[i]);
    for (int i = 0; i < n; ++i)  scanf("%lld",&b[i]);
    for (int i = 0; i < n; ++i) x[i].m=a[i]+b[i],x[i].id=i+1;
    qsort(x,n,sizeof(x[0]),comp);
    for (int i = 0; i < n; i=i+2)
        printf("%lld ",x[i].id);
    printf("\n");
    for (int i = 1; i < n; i=i+2)
        printf("%lld ",x[i].id);
    printf("\n");
    return 0;
}