题目链接:http://codeforces.com/contest/798/problem/D
题意:给你两长度为n的序列a和b,让你从里面选择n/2+1个位置出来,使得这个位置上的元素的和严格大于各自序列和的二分之一,让你输出n/2+1个数,代表位置
解析:假设只给你一个数组,不让你排序,如果你要选出这样的n/2+1个位置,那是不是,两两比较选择大的那个,再随便选一个之前没选过的,这样的贪心策略是不是会使得最后的结果大过总和的二分之一,如果可以排序那就更好选了。那么现在有两个数组了,如果在根据之前的贪心策略应该是有问题的,因为会有一个数组保证不了,那么我们就把一个数组进行排序,那就相当于把一个数组固定了起来,再对另一个数组贪心处理,反正就是对a数组排序,然后一定要选a中最大的,然后对b数组就是两两比较取最大的,反正大概就是那么个意思,各种乱搞应该能出来
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const int maxn = 1e5+100;
struct node
{
int v;
int id;
bool operator < (const node &b)const
{
return v>b.v;
}
}a[maxn];
int b[maxn];
vector<int>ans;
int main(void)
{
int n;
scanf("%d",&n);
int sum1 = 0,sum2 = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].v);
sum1 += a[i].v;
a[i].id = i;
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
sum2 += b[i];
}
ans.push_back(a[0].id);
for(int i=1;i<n-1;i+=2)
{
if(b[a[i].id]>b[a[i+1].id])
ans.push_back(a[i].id);
else
ans.push_back(a[i+1].id);
}
printf("%d\n",n/2+1);
if(n%2==0)
ans.push_back(a[n-1].id);
for(unsigned i = 0;i<ans.size();i++)
printf("%d ",ans[i]+1);
puts("");
return 0;
}