[ANOJ]1023缺失数[数学逻辑题]

本文介绍了一道数学逻辑题的高效解法,通过使用大小为1e7+2的数组实现O(n)时间复杂度的解决方案,避免了使用set导致的超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 原题: https://logn.me/problem/1023

2. 思路:

题意: 数学逻辑题。
思路:
普通方法,利用set的话,最后一个测试点还是会超时。/摊手
这题复杂度必须O(n)才不会超时。
仔细想一想,N最大值10^7, 那么结果最大值是1e7+1.
于是,我们新建一个Max大小的数组H,这里Max最小1e7+2,
为了保证H[1e7+1] = 0。
读入数据时,超过limit的忽略,范围内的保存下来。
然后遍历一遍,查找H[i] = 0 的即可。
已AC

3. 源码:

#include<iostream>
#include<algorithm>
#include<cstdint> //**使用int64_t
using namespace std;

int N;
const int Max = 1e7+2;
int limit = Max - 1; //极限值
int H[Max] = { 0 };

int main()
{
	freopen("in.txt", "r", stdin);
	scanf("%d", &N);
	int64_t tin;
	for (int i = 0; i < N; i++)
	{
		scanf("%lld", &tin);
		if (tin > 0 && tin < limit)
			H[tin] = 1;
	}
	
	for (int i = 1; i < Max; i++)
	{
		if (H[i] == 0)
		{
			printf("%d\n", i);
			break;
		}
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值