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

时间:2020-07-31 11:00:45

标签: c++ arrays algorithm optimization

我正在练习上一轮Google Kick Start 2020提出的问题。这个问题称为Record Breaker,如下所示:

伊莎亚娜(Isyana)在她位于N的当地主题公园获得了众多游客 连续多日。第i天的访问者数量为Vi。一天 如果满足以下两个条件,则将打破记录: 当天的访客人数严格大于人数 前几天的访问者数量。要么是最后一天, 或当天的访客人数严格大于 第二天的访客人数。请注意,第一天 可能是破纪录的一天!

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

输入输入的第一行给出测试用例的数量T。 测试用例如下。每个测试用例均以包含 整数N。第二行包含N个整数。第i个整数是 六。

输出对于每个测试用例,输出包含案例#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 2 0 6 4 8 15 16 23 42 9 3 1 4 1 5 9 2 6 5 6 9 9 9 9 9 9

输出案例1:2案例2:1案例3:3案例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 个答案:

答案 0 :(得分:1)

这会通过...

边缘保护套:

输入:

1

1

2

输出:

1

但是您的代码给出了0作为输出...

怎么了:

您首先要添加if语句为(i == 0 && arr [0]> arr [1]),但最多只能包含一个元素...因此,在这里,您首先必须检查此条件(i = = n-1 && arr [i]> m)...这意味着您必须做出正确的顺序...

此外,对于上述情况,初始化m = -1 Crucial ...

#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;
}