提问者:小点点

Google Kickstart 2020问题破纪录者错误答案


我正在练习这个问题,这个问题是在上一轮Google Kick Start 2020中被问到的。 该问题被称为记录打破者,如下所示:

Isyana被给予连续N天在她的当地主题公园的游客数量。 第i天的参观人数是6人。 如果一天同时满足以下两个条件,它就是破纪录的一天:当天的访客人数严格地大于前几天的访客人数。 要么是最后一天,要么是当天的参观人数严格大于第二天的参观人数。 请注意,第一天可能是打破记录的一天!

请帮助Isyana找出破纪录的天数。

输入输入的第一行给出测试用例的数量,然后是T。 每个测试用例以包含整数N的一行开始,第二行包含N个整数。 第i个整数是vi。

输出对于每个测试用例,输出一行包含case#x:y,其中x是测试用例号(从1开始),y是打破记录的天数。

限制时间限制:每个测试集20秒。 内存限制:1GB。 1≤T≤100。 0≤Vi≤2×105。

测试集1 1≤N≤1000。

最多10个测试用例的测试集2 1≤N≤2×105。 对于其余情况,1≤N≤1000。

样本

输入4 8 1 2 0 7 2 0 0 6 4 8 15 16 23 42 9 3 1 4 1 5 9 2 6 6 9 9 9 9 9 9 9

输出Case#1:2 Case#2:1 Case#3:3 Case#4:0

在示例案例#1中,下面的粗体和下划线数字表示打破记录的天数:1 2 0 7 2 0 2 0。

在示例案例#2中,只有最后一天是打破记录的一天。

在示例案例#3中,第一天,第三天和第六天是打破记录的日子。

在示例案例#4中,没有打破记录的一天。

这就是我创造的解决方案。 在第一个测试用例中,它给出了一个错误的答案,但是我想不出我遗漏了任何一个具体的用例。

#include<iostream>
#include<algorithm>

using namespace std;

int record_breaking(long long int arr[], long long int n)
{
    long long int ans = 0;
    long long int m = arr[0];
    for(long long int i = 0; i<n; i++)
    {
        //For first element
        if(i == 0 && arr[0] > arr[1])
        {
               ans++;
        }
        
        //For the last element
        else if(i == n - 1 && arr[i] > m)
        {
                ans++;
                //cout<<arr[i]<<" is a answer "<<endl;
               
        }
        //Normal Case
        else if(arr[i] > m && arr[i] > arr[i + 1])
        {
                ans++;
                //cout<<arr[i]<<" is a answer "<<endl;
        }
        m = max(arr[i], m);
    }
    return ans;
}

int main()
{
    int t;
    cin>>t;
    for(int test = 1; test <= t; test++)
    {
        long long int n;
        cin>>n;
        long long int arr[200000];
        //int *arr = new int [n];
        for(long long int i = 0; i<n; i++)
        {
            cin>>arr[i];
        }
        cout<<endl<<"Case #"<<test<<": "<<record_breaking(arr, n);
        //delete [] arr;
    }
    
    return 0;
}

请用我的解决方案帮我找出问题所在!


共1个答案

匿名用户

这会过去的。。。

边框:

输入:

1

1

2

输出:

1

但您的代码输出为0.。。

怎么了:

您要将第一个if语句添加为(i==0&&arr[0]>arr[1]),但元素不超过一个。。。 所以这里首先要检查这个条件(i==n-1&arr[i]>m).。。 也就是说你必须做出正确的命令。。。

此外,初始化m=-1对于以上边的情况至关重要。。。

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int record_breaking(vector<int> arr, int n)
{
    int ans = 0;
    int m = -1;
    for(int i = 0; i<n; i++)
    {
        
        //For the last element
        if(i == n - 1 && arr[i] > m)
        {
                ans++;
                //cout<<arr[i]<<" is a answer "<<endl;
               
        }

        //For first element
        else if(i == 0 && arr[0] > arr[1])
        {
               ans++;
        }

        //Normal Case
        else if(arr[i] > m && arr[i] > arr[i + 1])
        {
                ans++;
                //cout<<arr[i]<<" is a answer "<<endl;
        }
        m = max(arr[i], m);
    }
    return ans;
}

int main()
{
    int t;
    cin>>t;
    for(int test = 1; test <= t; test++)
    {
        int n, temp;
        cin>>n;
        vector<int> arr;
        //long long int arr[200000];
        //int *arr = new int [n];
        for(int i = 0; i<n; i++)
        {
            cin>>temp;
            arr.push_back(temp);
        }
        cout<<endl<<"Case #"<<test<<": "<<record_breaking(arr, n);
        //delete [] arr;
    }
    
    return 0;
}