我正在练习这个问题,这个问题是在上一轮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
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;
}