题目描述
龙城八大高校校友联盟继西太湖义行之后又隆重推出了拔河比赛,小X所在的南都大学校友会对这项赛事十分重视,专门指定重量级的小X来负责此事,每天下班后南都大学校友会的拔河队员只要有空都会前往中天体育馆训练,训练前小X先要将所有队员分成两个队,每队人数最多只能相差 1 人,且重量要尽可能接近,小X最近忙于研制量子计算机,没空写这个拔河程序,于是他找到了你,希望你帮他完成这项任务。
输入
输入数据第一行包含一个正整数 n,表示人数
第二行包含 n 个用空格隔开的正整数,表示每个人的重量 ai
输出
输出一行若干个整数,其中第一个整数为该组人数 t,之后 t 个整数表示每个人在原始数据中的编号,相邻两个整数间用一个空格隔开(其中一组的人确定下来后,另一组自然而然也就确定下来了),你只要输出任意一种可行的方案。
样例输入
复制样例数据 6
5 3 3 3 3 4
样例输出
3 1 2 3
提示
40%的数据,N<=6, a i <=10
70%的数据,N<=24, a i <=500
100%的数据,N<=36, a i <=10^15,注意重量要用 long long 类型数据!
思路是把序列先从小到大排一下,然后交换一部分数据使其变成一大一小的数列,提取前一半。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct stu{
int h;
int order;
}a[100000],temp;
int cmp(stu a,stu b)
{
return a.h<b.h;
}
int main()
{
int n,t,num;
cin>>n;
t=n/2;
for(int i=1;i<=n;i++)
{
cin>>a[i].h;
a[i].order=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n/2;i=i+2)
{
temp=a[i];
a[i]=a[n+1-i];
a[n-1-i]=temp;
}
printf("%d",t);
for(int i=1;i<=n/2;i++)
printf(" %d",a[i].order);
return 0;
}