如果一个数比左右两边都大,他就是一个声音裂缝, 现在你可以去掉数列中的任意一个 数字,使得声音裂缝数量最少
思路: 标记每个数
如果这个数比左右都大,就标成1,如果这个数比左右两边都小,就标成 -1 其他情况一律标成 0
我们发现 0的含义是单调,在这里没有什么突破口,
突破口在 -1 和 1 那里
那就详细讨论
i-1 | i | i+1 | 备注 | |
-1 | 1 | 0 | 消掉这个i 可以消除一个声音裂缝 | |
-1 | 1 | -1 | 消掉这个i 可以消除一个声音裂缝 | |
0 | 1 | -1 | 比较i左右大小,左边小或左右相等就 可以减掉一个,左边大不能减 | |
0 | 1 | 0 | 只有i左右两边相等了才能消掉一个,要不然就消掉i , 立刻 i-1 或i+1 成为新的声音裂缝 | |
1 | -1 | 1 | 左右相等 就-2 不相等就-1 | |
0 | -1 | 1 | 左大 或左右相等 -1 左小 不减 | |
1 | -1 | 0 | 相等 或左小 -1 | |
0 | -1 | 0 | 不减 |
诗经云:得意忘言,知道意思就忘了那句话吧,
知道我要表达什么意思就把这个图片忘了吧
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int main()
{
int t; cin>>t;
while(t--){
int n; cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int ans=0;
for(int i=2;i<n;i++)
{
if(a[i-1]<a[i] && a[i]>a[i+1] ) ans++,b[i]=1;
if(a[i-1]>a[i] && a[i]<a[i+1]) b[i]=-1;
}
int cou=0;
for(int i=2;i<n;i++)
{
if(b[i]==-1 ){
if(a[i-1]==a[i+1] && b[i-1]==1 && b[i+1]==1)
cou=max(cou,2);
if(b[i-1]==0 && b[i+1]==1)
{
if(a[i-1]>=a[i+1])
cou=max(cou,1);
}
if(b[i-1]==1 && b[i+1]==0)
if(b[i-1]<=b[i+1])
cou=max(cou,1);
}
if(b[i]==1)
{
if(b[i-1]==-1 && b[i+1]==0)
cou=max(cou,1);
if(b[i-1]==-1 && b[i+1]==-1)
cou=max(cou,1);
if(b[i-1]==0 && b[i+1]==-1)
{
if(a[i-1]<=a[i+1])
cou=max(cou,1);
}
if(b[i-1]==0 && b[i+1]==0)
{
if(a[i-1]==a[i+1])
cou=max(cou,1);
}
}
}
cout<<ans-cou<<endl;
}
return 0;
}
出自
https://www.cnblogs.com/yz-lucky77/p/10781125.html
大体意思是: 看i 是不是峰值,,再看去掉i的情况,i-1 ,i+1 分别是不是峰值 每走一步看看 没去掉i (原情况)和去掉i(一次操作之后的情况) 的最大差值
#include<iostream>
#include<string>
using namespace std;
int a[100005];
int main()
{
int t;
cin >> t;
while (t--)
{
int n,k=0,q=0,p=0;
cin >> n;
a[n + 1] = 0x7fffffff;
a[0] = 0x7fffffff;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++)
{
p = 0;
int yl = 0, xz = 0;
if (a[i] > a[i - 1] && a[i] > a[i + 1])
{
yl++;
k++;
}
if (a[i - 1] > a[i] && a[i - 1] > a[i - 2])
{
yl++;
}
if (a[i + 1] > a[i] && a[i + 1] > a[i + 2])
{
yl++;
}
if (a[i - 1] > a[i+1] && a[i - 1] > a[i - 2])
{
xz++;
}
if (a[i + 1] > a[i-1] && a[i + 1] > a[i + 2])
{
xz++;
}
p = yl - xz;
if (p > q)
q = p;
}
cout << k - q << endl;;
}
getchar();
getchar();
return 0;
}