给定两个长度为 n 的正整数序列 A=[a1,a2,…,an] 和 B=[b1,b2,…,bn] ,现在你选择 k 个数构成序列 P=[p1,p2,…,pk] 使得:
- 序列 P 中的元素是不重复的
- 1≤pi≤n ,其中 1≤i≤k
- 2×(ap1+⋯+apk) 大于序列 A 所有元素的和
- 2×(bp1+⋯+bpk) 大于序列 B 所有元素的和
- k 小于等于 ⌊n2⌋+1
现在请你找出一个满足上述条件的序列 P。
输入
输入第一行包含一个整数 n ( 1≤n≤106 ),表示序列 A 和 B 中元素的个数;
输入第二行包含 n 个用空格分隔的整数 a1,…,an ( 1≤ai≤109 ),表示序列 A 中的元素;
输入第三行包含 n 个用空格分隔的整数 b1,…,bn ( 1≤bi≤109 ),表示序列 B 中的元素。
输出
输出第一行为一个整数 k,表示找到的序列 P 中元素的个数;
输入第二行包含 k 个用空格分隔的整数 p1,…,pk ( 1≤pi≤n ),表示 P 中的不重复元素,P 中的元素可按任意顺序输出。
注意:答案可能有多个解,输出其中任意一组即可,此题开通 Special Judge。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
//参考讨论区里大佬的思路,选择元素之和的两倍大于所有元素之和,等价于选择元素之和大于剩下的元素
//先对A从大到小排序,这样两两一组看的话,不管怎么样A都是满足题意的
//则接下来只要对B两两一组选大即可
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int Num_A;
int Num_B;
int Index;
}NUM;
NUM num[1000005];
int cmp(const void*a, const void*b)
{
return (*(NUM*)a).Num_A < (*(NUM*)b).Num_A ? 1 : -1;
}
int main()
{
int count, Count;
scanf("%d", &Count);
for (int i = 0; i < Count; i++)
{
scanf("%d", &num[i].Num_A);
num[i].Index = i + 1;
}
for (int i = 0; i < Count; i++)
scanf("%d", &num[i].Num_B);
qsort(num, Count, sizeof(num[0]), cmp);
count = Count / 2 + 1;
printf("%d\n%d", count, num[0].Index);
for (int i = 1,j=1; j < count; i++,j++)
{
if (num[i].Num_B > num[i + 1].Num_B)
printf(" %d", num[i].Index);
else
printf(" %d", num[i + 1].Index);
i++;
}
printf("\n");
return 0;
}