链接https://ac.nowcoder.com/acm/contest/3003/F
牛牛和 牛可乐 面前有 n 个物品,这些物品编号为 1,2,\dots,n1,2,…,n ,每个物品有两个属性 a_i, b_iai,bi 。
牛牛与 牛可乐会轮流从剩下物品中任意拿走一个, 牛牛先选取。
设 牛牛选取的物品编号集合为 H,牛可乐选取的物品编号的集合为 T,取完之后,牛牛 得分为 \sum_{i\in H} a_i∑i∈Hai;而 牛可乐得分为 \sum_{i\in T} b_i∑i∈Tbi。
牛牛和 牛可乐都希望自己的得分尽量比对方大(即最大化自己与对方得分的差)。
你需要求出两人都使用最优策略的情况下,最终分别会选择哪些物品,若有多种答案或输出顺序,输出任意一种。
输入描述:
第一行,一个正整数 n,表示物品个数。 第二行,n 个整数 a_1,a_2,\dots,a_na1,a2,…,an,表示 n 个物品的 A 属性。 第三行,n 个整数 b_1,b_2,\dots,b_nb1,b2,…,bn,表示 n 个物品的 B 属性。 保证 2\leq n\leq 2\times 10^52≤n≤2×105,0\leq a_i,b_i\leq 10^90≤ai,bi≤109。
输出描述:
输出两行,分别表示在最优策略下 牛牛和 牛可乐各选择了哪些物品,输出物品编号。
示例1
输入
复制
3 8 7 6 5 4 2
输出
复制
1 3 2
说明
3 1
2
也会被判定为正确
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,t,g,k,l,o,s,r,ans,ss,max1=0;
struct node {
int s;
int f;
int id;
}a[200005],b[200005];
bool cmp(node p,node q)
{
if(p.s+p.f!=q.s+q.f)
return p.s+p.f>q.s+q.f;
else if(p.s!=q.s)
return p.s>q.s;
else
return p.f>q.f;
}
map<long long,long long>m;
queue<long long>aa,bb;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].s;
a[i].id=i;
}
for(int i=1;i<=n;i++)
{
cin>>b[i].s;
a[i].f=b[i].s;
b[i].id=i;
b[i].f=a[i].s;
}
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
int ia=1,ib=1;
for(int i=1;i<=n;i++)
{
if(i%2==1)
{
while(m[a[ia].id]!=0)
{
ia++;
}
aa.push(a[ia].id);
m[a[ia].id]=1;
ia++;
}
else
{
while(m[b[ib].id]!=0)
{
ib++;
}
bb.push(b[ib].id);
m[b[ib].id]=1;
ib++;
}
}
while(!aa.empty())
{
cout<<aa.front()<<" ";
aa.pop();
}
cout<<endl;
while(!bb.empty())
{
cout<<bb.front()<<" ";
bb.pop();
}
}