1. 程式人生 > >中石油新生賽第八場 問題 G: 常州拔河

中石油新生賽第八場 問題 G: 常州拔河

題目描述
龍城八大高校校友聯盟繼西太湖義行之後又隆重推出了拔河比賽,小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; }