题意:n个人(n<=1e5),每个人价值为ai,要求分成2组,使得两组人数之差<=1 && 两组价值差小于<=max(ai)
构造即可:按价值排序后 奇数号给x,偶数号给y(看成天平,每次倾斜向每次选人的那一边)每轮两边差为a[i]-d d>=0 所以两边差始终<=max(a[i])
或者把价值表示在x轴上 [1,2] [3,4] 为一段 则所以线段都落在[0,max(ai)]内,容易看出每段之差的累加和也在max(a[i])内.
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+20;
int n;
pair<int,int> a[N];
vector<int> x,y;
int main()
{
while(cin>>n)
{
int mx=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].first);
a[i].second=i;
}
sort(a+1,a+1+n);
int x;
if(n%2)
x=n/2+1;
else
x=n/2;
cout<<x<<endl;
for(int i=1;i<=n;i+=2)
cout<<a[i].second<<' ';
cout<<endl<<n-x<<endl;
for(int i=2;i<=n;i+=2)
cout<<a[i].second<<' ';
cout<<endl;
}
return 0;
}