如果一個數比左右兩邊都大,他就是一個聲音裂縫, 現在你可以去掉數列中的任意一個 數字,使得聲音裂縫數量最少
思路: 標記每個數
如果這個數比左右都大,就標成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;
}