30. 序列构造

给定两个等长正整数序列A和B,找出一个不超过n/2+1个不重复元素的序列P,使得2倍P序列和分别大于A、B序列和。输入包含序列A和B的元素,输出满足条件的序列P的长度及其元素。

给定两个长度为 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);
		else
			printf(" %d", num[i + 1].Index);
		i++;
	}
	printf("\n");

	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值