我已经为这个问题编写了以下代码,ideone并没有给我运行时错误但是codechef的编译器给了我一个。 codechef中的编译器是gcc 4.9.2
问题 [链接:https://www.codechef.com/problems/MOVIEWKN]
预期输入
输入的第一行包含一个整数T,表示测试用例的数量。
测试用例描述的第一行包含整数n(电影数量)。
测试用例描述的第二行包含n个整数L1,L2,...,Ln(L是电影的长度)。以下行包含n个整数R1,R2,...,Rn(R是电影的等级)。
我的输入
2
2
1 2
2 1
4
2 1 4 1
2 4 1 4
预期输出
对于每个测试用例,输出一个表示电影索引的整数i。请注意,遵循从1开始的索引。
我的输出
1
2
解释
在第一个示例情况下,两个胶片具有相同的L×R值,但第一个胶片具有更好的等级。 在第二个示例的情况下,第二和第四部电影同样好,但第二部电影的索引较小
我的解决方案
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
int T;
cin >> T;
cin.ignore();
if (T >= 1 && T <= 5) {
for (int q = 0; q < T; q++) {
int n;
size_t pos;
cin >> n;
cin.ignore();
if (n >= 1 && n <= 100) {
vector<int> L;
vector<int> R;
vector<int> C;
for (int u = 0; u < n; u++) {
int a;
cin >> a;
cin.ignore();
if (a >= 1 && a <= 100) {
L.push_back(a);
}
}
for (int u = 0; u < n; u++) {
int a;
cin >> a;
cin.ignore();
if (a >= 1 && a <= 100) {
R.push_back(a);
}
}
for (int u = 0; u < n; u++) {
int df = (L[u] * R[u]);
C.push_back(df);
}
for (size_t u = 0; u < C.size(); u++) {
int max = C[0];
if (max < C[u]) {
max = C[u];
pos = u+1;
}
if (max == C[u]) {
if (R[pos-1] < R[u]) { pos = u + 1; }
if (R[pos - 1] == R[u]) {
if (pos > u) { pos = u + 1; }
}
}
}
cout << pos << endl;
}
}
}
return 0;
}
在完成关于codechef问题的运行时错误的一些问题后,我猜测问题与访问边界元素有关,但我无法确定实际问题
答案 0 :(得分:2)
在这一行:
if (R[pos - 1] < R[u]) { pos = u + 1; }
第一次循环,pos
未初始化,导致未定义的行为。
简单修复:
在循环
之前添加pos = 1
答案 1 :(得分:0)
我可能迟到了,但这是我的简单解决方案:
t=int(input())
for j in range(0,t):
n=int(input())
a=[int(ele) for ele in input().split()]
b=[int(ele) for ele in input().split()]
c=[]
pos=0
max=-1
max2=-1
for i in range(0,n):
fl=0
c.append(a[i]*b[i])
if(max<c[i]):
max=c[i]
fl=1
if(fl==1):
pos=i+1
max2=b[i]
elif(max==c[i]):
if(max2<b[i]):
pos=i+1
max2=b[i]
print(pos)