电话价格问题(十月挑战Codechef)

时间:2019-10-11 03:40:36

标签: c++

问题陈述: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;
}

1 个答案:

答案 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_ofstd::all_of。例如:

    bool goodPrice = std::all_of(arr, arr+5, [k](int p) { return p < *k; });