链接: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; }