Problem 1487 缺失的数据
Accept: 1206 Submit: 2831 Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
网络传输中由于受到链路层的最大传输单元(Maximum Transmission Unit,MTU)的限制,在很多情况下需要对原始的数据报进行分片,使得每一分片可以顺利的传输。F公司的网络设备根据MTU的限制将每个原始的数据划分成n片,用1~n这n个数字对每个分片进行编号,在目的主机上将这些分片重新组合成原始的数据。可是在测试中发现一个问题:经常出现缺失一个数据分片的情况。公司希望在将分片重新组合前就能知道缺失的数据分片编号。
Input
有多组输入数据,你必须处理到EOF为止。
每组输入数据第一行就一个整数n(2<=n<=105), 表示数据分成了n片。
第二行有n-1个以空格隔开的整数,表示目的主机收到的数据分片的编号,由于网络传输的一些因素,数据分片到达的顺序是随机的。
Output
输出缺失的数据片编号。
Sample Input
5 5 3 2 1
Sample Output
4
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就好了~