问题陈述:https://www.codechef.com/OCT19B/problems/S10E 我的解决方案适用于我在IDE上尝试过的所有测试用例,但codechef说这是错误的。我是编程的新手,所以请帮助我找出问题所在。
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
int main() {
int t, n, arr[5];
string p;
cin >> t;
vector<int> v;
int m = 0;
for (int i = 0; i < t; i++) {
int gdcount = 0;
//intialising temporary array part
for (int j = 0; j < 5; j++) {
arr[j] = 751;
}
//taking input as per number of n test cases
cin >> n;
cin.ignore();
getline(cin, p);
stringstream ss;
ss << p;
string temp;
int g;
for (int x = 0; x < n; x++) {
ss >> temp;
if (stringstream(temp) >> g) {
v.push_back(g);
}
}
//checking and storing good days in gdcount variable
for (auto k = v.begin(); k < v.end(); k++) {
int count = 0;
for (int l = 0; l < 5; l++) {
if (*k > arr[l]) {
count++;
}
}
if(count == 0){
gdcount++;
}
arr[m] = *k;
m++;
if (m >= 5) {
m = 0;
}
}
cout << gdcount << endl;
}
system("pause");
return 0;
}
答案 0 :(得分:1)
您的测试*k > arr[l]
似乎不正确。通过此测试后,您会说“如果当前价格*k
大于前五天的价格,则不是一个好价格。”
但是,一个好的价格的定义是不同的:
如果严格低于前五天所观察到的所有价格,主厨会认为手机的价格很好。
因此,实际上,“价格不好”的检验还应包括等于 *k
的检验。
换句话说,您的测试应该是:
for (int l = 0; l < 5; l++) {
if (*k >= arr[l]) {
count++;
}
}
几乎可以保证,这样的练习将使用测试边界条件的输入。但是他们经常会给您提供无法测试这些条件的示例。这可以帮助您培养“程序员的眼睛”,以准确地捕获细节并确保您构建自己的测试。
使用<
运算符来测试迭代器是不正确的,因为您当前正在这样做:
for (auto k = v.begin(); k < v.end(); k++) ...
相反,您必须使用end
对!=
进行测试:
for (auto k = v.begin(); k != v.end(); k++) ...
没有理由合计不良价格的数量。您只需要知道任何是否不好。您可以简单地做到这一点:
bool goodPrice = true;
for (int l = 0; l < 5; l++) {
if (*k >= arr[l]) {
goodPrice = false;
break; // No need to do any further tests
}
}
另一种方法是使用std::any_of
或std::all_of
。例如:
bool goodPrice = std::all_of(arr, arr+5, [k](int p) { return p < *k; });