Description
Input
Output
Solution
神奇题目。。。
思路是构造一个可行方案:
有n个糖果,按a从大到小排序,取第一个糖果,之后再取第二个和第三个中b大的,再取第四个和第五个中b大的…依次类推。
证明:
以下 n 2 \frac {n}{2} 2n皆为向下取整。
设m=
n
2
+
1
\frac {n}{2}+1
2n+1,取的m个数的下标为
x
1
x_1
x1到
x
m
x_m
xm。
无非就两个条件:
- ∑ i = 1 m a i > ∑ i = 1 n a i 2 \sum_{i=1}^m \quad a_i > \frac {\sum_{i=1}^n\quad a_i}{2} ∑i=1mai>2∑i=1nai
- ∑ i = 1 m b i > ∑ i = 1 n b i 2 \sum_{i=1}^m \quad b_i > \frac {\sum_{i=1}^n\quad b_i}{2} ∑i=1mbi>2∑i=1nbi
分类讨论:
- n%2==1
应有取得的前 n 2 \frac {n}{2} 2n个数大于前n-1个数a值之和的一半,再加上最后一个数必然满足①式。
同理取得的后 n 2 \frac {n}{2} 2n个数大于后n-1个数b值之和的一半,再加上第一个数必然满足②式。 - n%2==0
等于在上面基础上再在末尾加一个数,必然满足①②式。
Code
#include<bits/stdc++.h>
using namespace std;
struct data{
int a,b,id;
}c[100010];
bool cmp(data u,data v){
return u.a>v.a;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&c[i].a);
c[i].id=i;
}
for(int i=1;i<=n;i++)
scanf("%d",&c[i].b);
sort(c+1,c+n+1,cmp);
printf("%d\n",n/2+1);
printf("%d ",c[1].id);
for(int i=2;i<=n;i+=2){
if(c[i].b>c[i+1].b) printf("%d ",c[i].id);
else printf("%d ",c[i+1].id);
}
}