我正在练习上一轮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;
}
请帮助我找出解决方案的问题!
答案 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;
}