30. 序列构造

来源:互联网 发布:淘宝商城男装t恤 编辑:程序博客网 时间:2024/05/30 23:55

给定两个长度为 n 的正整数序列 A=[a1,a2,,an]B=[b1,b2,,bn],现在你选择 k 个数构成序列 P=[p1,p2,,pk] 使得:

  1. 序列 P 中的元素是不重复的
  2. 1pin,其中1ik
  3. 2×(ap1++apk) 大于序列 A 所有元素的和
  4. 2×(bp1++bpk) 大于序列 B 所有元素的和
  5. k 小于等于 n2+1

现在请你找出一个满足上述条件的序列 P。

输入

输入第一行包含一个整数 n (1n106),表示序列 A 和 B 中元素的个数;

输入第二行包含 n 个用空格分隔的整数 a1,,an (1ai109),表示序列 A 中的元素;

输入第三行包含 n 个用空格分隔的整数 b1,,bn (1bi109),表示序列 B 中的元素。

输出

输出第一行为一个整数 k,表示找到的序列 P 中元素的个数;

输入第二行包含 k 个用空格分隔的整数 p1,,pk (1pin),表示 P 中的不重复元素,P 中的元素可按任意顺序输出。

注意:答案可能有多个解,输出其中任意一组即可,此题开通 Special Judge。

测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示

  1. 5↵
  2. 8 7 4 8 3↵
  3. 4 2 5 3 7↵
以文本方式显示
  1. 3↵
  2. 1 4 5↵
1秒64M0

//参考讨论区里大佬的思路,选择元素之和的两倍大于所有元素之和,等价于选择元素之和大于剩下的元素//先对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);elseprintf(" %d", num[i + 1].Index);i++;}printf("\n");return 0;}




原创粉丝点击