FZU Problem 1487 缺失的数据

Problem 1487 缺失的数据

Accept: 1206 Submit: 2831 Time Limit: 1000 mSec Memory Limit : 32768 KB

img Problem Description

网络传输中由于受到链路层的最大传输单元(Maximum Transmission Unit,MTU)的限制,在很多情况下需要对原始的数据报进行分片,使得每一分片可以顺利的传输。F公司的网络设备根据MTU的限制将每个原始的数据划分成n片,用1~n这n个数字对每个分片进行编号,在目的主机上将这些分片重新组合成原始的数据。可是在测试中发现一个问题:经常出现缺失一个数据分片的情况。公司希望在将分片重新组合前就能知道缺失的数据分片编号。

img Input

有多组输入数据,你必须处理到EOF为止。

每组输入数据第一行就一个整数n(2<=n<=105), 表示数据分成了n片。

第二行有n-1个以空格隔开的整数,表示目的主机收到的数据分片的编号,由于网络传输的一些因素,数据分片到达的顺序是随机的。

img Output

输出缺失的数据片编号。

img Sample Input

5 5 3 2 1

img Sample Output

4

img Source

福州大学第四届程序设计竞赛

解决方案

虽然是个简单题,但是还是有些小细节在里面的。

一开始的想法是输入存数组,然后sort()排序,在线性遍历判断找出缺片,但是超时了。

换个思路减少时间复杂度(主要是要去掉排序操作),用一个longlong型来存n!再减去所有输入值的总和就可以得到答案。n!的运算和减去输入值的运算放在输入的for循环里,这样时间复杂度就是O(n)啦。

然而还是超时。

想了5s觉得可能是因为循环中的输入用了cin,说干就干,把cin改成scanf,于是就过了,93 ms,时间至少缩短了10倍吧?scanf真强~

所以像这类输入数据量大的题还是老老实实别偷懒,好好用scanf就好了。

#include<iostream>
long long ans;
int main() {
	int n, i, num;
	while (scanf("%d", &n) != EOF) {
		ans = 0;
		for (i = 1; i <= n-1; i++) {
			ans += i;
			scanf("%d", &num);
			ans -= num;
		}
		ans += n;
		printf("%I64d\n", ans);
	}
}

偷偷吐槽:要是复试前有刷OJ就好了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值