UVa 10055 - Hashmat the brave warrior 解题报告

跟着《算法竞赛入门经典》的脚步,子勤试着在 UVa Online Judge 上做题。#10055 - Hashmat the brave warrior 是我做的第1题。但没想到的是,第1题就把我给坑到了,WA 了两次才过。


题目分析

这道题应该算得上是 UVa 上非常简单的一道题目。它以战士 Hashmat 与敌方的士兵数量之差为背景,其实就是让我们计算两数之差。值得注意的有:

  • 数据的范围:The input numbers are not greater than 2322^{32}
  • 输入的顺序并不是固定的,既可能是先 Hashmat 后 Opponents,也能倒过来;而最终输出的是一个正数。

一看到 2^32,我就马上想,哈哈,不超过 32 位整数,直接 int 就可以啦!然后就这样挂掉了。

一下子脑子短路没想明白为啥错了,所以搜了一下。这才想起,int 是有符号位的,最大只能表示到 23112^{31}-1。用 unsigned int 也还不够,因为它的最大值为 23212^{32}-1(第 1 位为 0 占去了一个,所以要减去 1)。所以,用 long long 吧。


解答

10055.cpp
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
long long a, b;
while(cin >> a >> b)
a < b ?
cout << b - a << endl:
cout << a - b << endl;
return 0;
}