问题描述
问题是:给定长度为m
和n
的两个正整数数组,找到(x,y)
的所有 x^y > y^x
对。 (将左侧操作数提高到右侧的幂)
我遵循以下逻辑:
-
如果
x = 1
,则没有有序对满足条件。 -
如果
y = 1
和x != 1
,则所有x
都满足条件。 -
该条件对于
y > x
的所有其余情况为真。 -
例外是:
(2,3),(2,4) and (3,2)
我的代码是:
int main(){
int n,m;
cin >> m >> n;
int a[m],b[n];
for(int i = 0; i < m; i++) cin >> a[i];
for(int i = 0; i < n; i++) cin >> b[i];
int count = 0;
for(int i = 0; i < m; i++){
if(a[i] != 1){
for(int j = 0; j < n; j++){
if(b[j] == 1) count++;
else if(a[i] == 2 && b[j] >= 5) count++;
else if(a[i] == 3 &&(b[j] == 2 || b[j] >=4)) count++;
else if(b[j] > a[i]) count++;
}
}
}
cout << count << endl;
}
对于某些大输出(在geeksforgeeks上),代码输出的值比正确答案大一。 (例如12575,而不是预期的12574的输出,错误为1)
我无法弄清楚代码在哪里失败。感谢您的帮助!
解决方法
您为数组使用了错误的大小:
int a[n],b[m]; // a[n],b[m]
for(int i = 0; i < m; i++) cin >> a[i]; // a[m]
for(int i = 0; i < n; i++) cin >> b[i]; // b[n]
这意味着,如果数组的大小不同,则您将具有未定义的行为。
您可能还会以不正确的顺序读取数组大小:
cin >> m >> n;
建议进行更改以使使用标准C ++ 17(无VLA:s)更容易发现问题:
#include <cstddef>
#include <iostream>
#include <vector>
int main() {
if(size_t n,m; std::cin >> n >> m) {
std::vector<unsigned> a(n);
std::vector<unsigned> b(m);
for(auto& v : a) std::cin >> v;
for(auto& v : b) std::cin >> v;
int count = 0;
for(auto aval : a) {
if(aval != 1) {
for(auto bval : b) {
if(bval == 1)
count++;
else if(aval == 2 && bval >= 5)
count++;
else if(aval == 3 && (bval == 2 || bval >= 4))
count++;
else if(bval > aval)
count++;
}
}
}
std::cout << count << '\n';
}
}
,
您要同时计算(2,4)
和(2,3)
,因为这些情况最终都处于最后一种情况。
将它们视为异常的最简单方法是确保同时处理所有“ 2种情况”:
if (a[i] == 2)
if (b[j] >= 5)
count++;
或
if (a[i] == 2)
count += b[j] >= 5;
当代码应在某些情况下例外时,请确保测试这些例外情况。