c++ 我写的代码作为这个问题的解决方案,但它是给错误的输入,我不能找到正确的解决方案

x8diyxa7  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(168)

问题是
厨师大学一个学期有120个工作日,学校的要求是学生在学期中至少有75%的工作日在学校,否则该学生不及格。
Chef放了很多假,现在关心的是他是否能通过考勤要求,已经过了N个工作日,给你N个比特B1,B2,...,BN,Bi = 0表示Chef第i天缺席,Bi = 1表示Chef当天在场。
主厨有希望在学期末通过考试吗?

输入:

第一行包含T,即测试用例的数量。然后是测试用例。每个测试用例包含两行输入。每个测试用例的第一行包含一个整数N,即到目前为止的天数。每个测试用例的第二行包含长度为N的字符串BB,其中Bi表示第i天的状态。

输出:

对于每个测试用例,在一行中输出答案-如果Chef可以通过出勤要求,则为“YES”,否则为“NO”。
我想出了这个密码

#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;

    while (t--) {
        int n;
        cin >> n;
    
        int a[n];
        int cnt = 0;
    
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            if (a[i] == 1) {
                cnt++;
            }
        }
    
        if (cnt >= n-30) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }

    return 0;
}

我不知道这密码有什么问题。

42fyovps

42fyovps1#

我知道问题所在了。
您将看到一个测试用例,如下所示:

5
 11111

但是正试图以“整数乘整数”的方式读取它。由于a[i]intcin >> a[i]将以数字11111而不是单个1的形式读取它。
不是一次阅读一个整数,而是一次读取一个字符。而且您也不需要a数组,因为您只是在计算1出现的次数。还要注意== '1'的比较(与字符文字的比较),而不是整数比较== 1
这应该可以修复它:

while (t--) {
        int n;
        int cnt = 0;

        cin >> n;
    
        for (int i = 0; i < n; i++) {
            char c;
            cin >> c;
            if (c == '1') {
                cnt++;
            }
        }
    
        if (cnt >= n-30) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }

此外,计算字符'0'出现的次数并测试它是否超过30次不是更容易吗?

while (t--) {
        int n;
        int cnt = 0;

        cin >> n;
    
        for (int i = 0; i < n; i++) {
            char c;
            cin >> c;
            if (c == '0') {
                cnt++;
            }
        }
    
        if (cnt <= 30) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }

相关问题