【发布时间】:2017-07-04 18:19:30
【问题描述】:
这是来自 Codility 的三角问题:
给出了一个由 N 个整数组成的零索引数组 A。
三元组 (P, Q, R) 是三角形的,如果 0 ≤ PA[P] + A[Q] > A[R],
A[Q] + A[R] > A[P],
A[R] + A[P] > A[Q]。写一个函数:
int solution(vector<int> &A);给定一个由 N 个整数组成的零索引数组 A,返回 1 如果此数组存在三角形三元组并返回 0 否则。
例如,给定数组 A 使得:
A[0] = 10, A[1] = 2, A[2] = 5, A[3] = 1, A[4] = 8, A[5] = 20 三元组 (0, 2, 4) 是三角形的,函数应该返回 1。给定数组 A 使得:
A[0] = 10, A[1] = 50, A[2] = 5, A[3] = 1
函数应该返回 0。假设:
N 是 [0..100,000] 范围内的整数;
数组 A 的每个元素都是范围内的整数 [−2,147,483,648..2,147,483,647]。
这是我在 C++ 中的解决方案:
int solution(vector<int> &A) {
if(A.size()<3) return 0;
sort(A.begin(), A.end());
for(int i=0; i<A.size()-2; i++){
//if(A[i] = A[i+1] = A[i+2]) return 1;
if(A[i]+A[i+1]>A[i+2] && A[i+1]+A[i+2]>A[i] && A[i+2]+A[i]>A[i+1]){
return 1;
}
}
return 0;
}
我已经检查了那里的 cmets,所有解决方案似乎都与我的相似。
然而,虽然其他人声称获得了 100%,但我只获得了 93% 的分数。
我得到了所有的测试用例,除了一个:
extreme_arith_overflow1
溢出测试,3 MAXINTs
我假设这个案例有一些这样的输入:
[2147483647, 2147483647, 2147483647]
所以我将它添加到自定义测试用例中,结果显然应该是 1,而答案却是 0。
我也试过[1900000000, 1900000000, 1900000000],答案还是0。
但是,[1000000000, 1000000000, 1000000000] 正确答案为 1。
谁能告诉我为什么会出现这个结果?
非常感谢。
【问题讨论】:
-
听起来像是正常的整数溢出。 en.wikipedia.org/wiki/Integer_overflow
-
制作 long long int 的向量
-
刚刚查了一下:这个例子中的 int 是 32 位,long int 保证 32 位,在 Unix 上可能是 64,而 long long int 保证 64,所以这就是使用 long long int 的原因在这个情况下。感谢您的帮助!
-
不错的解决方案。我有同样的结果。我通过将每个比较的一侧转换为(长)来修复它。所以在你的行中,我会在三个地方这样做:
if((long)A[i]+A[i+1]>A[i+2] && ...
标签: c++ algorithm math integer-overflow