电影周末 Codechef 初学者部分:运行时错误
Movie Weekend Codechef Beginner Section : Runtime Error
我已经为这个问题编写了以下代码,ideone 没有给我运行时错误,但是 codechef 的编译器给了我一个。 codechef 中的编译器是 gcc 4.9.2
问题 [Link : https://www.codechef.com/problems/MOVIEWKN]
小叶戈尔是个超级电影迷。他喜欢看不同类型的电影:从剧情片到喜剧片,从青春片到恐怖片。他计划这个周末去看电影,但不确定应该看哪部电影。
这个周末有 n 部电影要看。每部电影可以用两个整数 Li 和 Ri 来表征,表示相应电影的长度和等级。 Egor 想看一部具有 Li × Ri 最大值的电影。如果有几部这样的电影,他会选择其中 Ri 最大的一部。如果仍然平局,他会选择其中索引最小的那个。
你的任务是帮助 Egor 选择周末要看的电影。
预期输入
输入的第一行包含一个整数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 问题的运行时错误问题后,我猜测问题与访问边界元素有关,但我无法查明实际问题
这一行:
if (R[pos - 1] < R[u]) { pos = u + 1; }
第一次循环时,pos
未初始化,导致未定义的行为。
简单修复:
在循环前添加pos = 1
我可能来晚了,但这是我的简单解决方案:
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)
我已经为这个问题编写了以下代码,ideone 没有给我运行时错误,但是 codechef 的编译器给了我一个。 codechef 中的编译器是 gcc 4.9.2
问题 [Link : https://www.codechef.com/problems/MOVIEWKN]
小叶戈尔是个超级电影迷。他喜欢看不同类型的电影:从剧情片到喜剧片,从青春片到恐怖片。他计划这个周末去看电影,但不确定应该看哪部电影。 这个周末有 n 部电影要看。每部电影可以用两个整数 Li 和 Ri 来表征,表示相应电影的长度和等级。 Egor 想看一部具有 Li × Ri 最大值的电影。如果有几部这样的电影,他会选择其中 Ri 最大的一部。如果仍然平局,他会选择其中索引最小的那个。 你的任务是帮助 Egor 选择周末要看的电影。
预期输入
输入的第一行包含一个整数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 问题的运行时错误问题后,我猜测问题与访问边界元素有关,但我无法查明实际问题
这一行:
if (R[pos - 1] < R[u]) { pos = u + 1; }
第一次循环时,pos
未初始化,导致未定义的行为。
简单修复:
在循环前添加pos = 1
我可能来晚了,但这是我的简单解决方案:
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)