http://codeforces.com/problemset/problem/798/D
存结构体 对a排序 然后两个两个的选 选i和i+1中b值大的 这样保证了大于b的一半 又因为选 n/2+1(向下取整)多出来的肯定先把a中最大的选了 至于为什么可以考虑最怀情况 即二选一时被选的下标在a中总是对应小值 但如果先把a中最大的一个或两个选掉 就变成二选一总选最大的了 即[小大][小大]...[小大]转为[大小][大小][大小]...[大] 必然也是满足大于一半的
#include <bits/stdc++.h>
using namespace std;
struct node
{
int id;
int a;
int b;
};
node ary[100010];
int ans[50010];
int n,len;
bool cmp(node n1,node n2)
{
return n1.a<n2.a;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++) ary[i].id=i;
for(i=1;i<=n;i++) scanf("%d",&ary[i].a);
for(i=1;i<=n;i++) scanf("%d",&ary[i].b);
sort(ary+1,ary+n+1,cmp);
if(n%2)
{
ans[1]=ary[n].id;
len=1;
for(i=1;i<=n-1;i+=2)
{
if(ary[i].b>ary[i+1].b) ans[++len]=ary[i].id;
else ans[++len]=ary[i+1].id;
}
}
else
{
ans[1]=ary[n].id,ans[2]=ary[n-1].id;
len=2;
for(i=1;i<=n-2;i+=2)
{
if(ary[i].b>ary[i+1].b) ans[++len]=ary[i].id;
else ans[++len]=ary[i+1].id;
}
}
printf("%d\n",len);
for(i=1;i<=len;i++) printf("%d ",ans[i]);
printf("\n");
return 0;
}