浙江省赛之Singing Everywhere

时间:2022-06-19 22:46:32

题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5996

方法:

在大佬的指导下完成。

寻找峰值,找到一共k个峰值。

遍历:使a[0]=231,a[n+1]=231(0xfffffff),从第一个数开始,判断它的存在有多少个峰值 yu,它被去掉后有多少个峰值xz  (这时不是找出所有的峰值,而是看(a[i-1],a[i],a[i+1])这三个数中有几个是峰值就可以)。

q存储着上一次的yu-xz;也就是去掉上一个数可以减少多少个峰值,所以最终的p和q的最大值就是可以减少的最多的峰值。

原来的峰值个数-减少的峰值个数=结果。

#include<iostream>
#include<string>
using namespace std;
int a[];
int main()
{
int t;
cin >> t;
while (t--)
{
int n,k=,q=,p=; cin >> n;
a[n + ] = 0x7fffffff;
a[] = 0x7fffffff;
for (int i = ; i <= n; i++)
cin >> a[i];
for (int i = ; i < n; i++)
{
p = ;
int yl = , xz = ;
if (a[i] > a[i - ] && a[i] > a[i + ])
{
yl++;
k++;
}
if (a[i - ] > a[i] && a[i - ] > a[i - ])
{
yl++;
}
if (a[i + ] > a[i] && a[i + ] > a[i + ])
{
yl++;
}
if (a[i - ] > a[i+] && a[i - ] > a[i - ])
{
xz++;
}
if (a[i + ] > a[i-] && a[i + ] > a[i + ])
{
xz++;
}
p = yl - xz;
if (p > q)
q = p; }
cout << k - q << endl;;
} getchar();
getchar();
return ;
}