题目描述:
题解:
正确性证明:
首先因为每两个中b都取大的那个,所以b一定满足条件
我们着重讨论a:
举一个有五个数的例子,设排序后有这样一个数列
a+k4+k3+k2+k1,a+k3+k2+k1,a+k2+k1,a+k2,a (k4,k3,k2,k1均>=0)
极端情况下我们取
a+k4+k3+k2+k1,a+k2+k1,a
剩下
a+k3+k2+k1,a+k1
因为 a+k4+k3+k2+k1>k3+k1
所以 a+k4+k3+k2+k1>(a+k3+k2+k1)-(a+k2+k1)+(a+k1)-a
所以 (a+k4+k3+k2+k1)+(a+k2+k1)+a>(a+k3+k2+k1)+(a+k1)
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int n; struct data{ ll num;int id; }a[100005]; ll b[100005]; bool cmp(data x,data y){ return x.num>y.num; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i].num); a[i].id=i; } for(int i=1;i<=n;i++){ scanf("%lld",&b[i]); } sort(a+1,a+n+1,cmp); printf("%d\n",n/2+1); printf("%d ",a[1].id); for(int i=2;i<=n;i+=2){ if(b[a[i].id]<=b[a[i+1].id]) printf("%d ",a[i+1].id); else printf("%d ",a[i].id); } return 0; }