1200*C. Make It Good(二分 || 贪心)

Make It Good - 洛谷

Problem - 1385C - Codeforces

思路一:

二分答案,每次check从mid+1开始,判断能否形成要求的序列。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,a[N];
bool check(int x){
	int p=0,i=x+1,j=n;
	while(i<=j){ 
		if(a[i]<=a[j]){
			if(a[i]>=p) p=a[i];
			else return false;
			i++;
		}
		else{
			if(a[j]>=p) p=a[j];
			else return false;
			j--;
		}
	}
	return true;
} 
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		int l=0,r=n-1;
		while(l<r){
			int mid=l+r>>1;
			if(check(mid)) r=mid;
			else l=mid+1;
		}
		printf("%lld\n",l);
	}
	return 0;
}

思路二:

我们可以将数据按照大小比喻成一个"山峰",如下图。

左侧则符合题意,右侧则只有右半边的"山峰"符合题意。所以我们从右侧模拟"上山"找到第一个山峰,然后"下山"直到无法"下山"为止即为答案。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,a[N];
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		int p=n;
		while(a[p-1]>=a[p]&&p>1) p--; 
		while(a[p-1]<=a[p]&&p>1) p--;
		printf("%lld\n",p-1);
	}
	return 0;
}
相关推荐
粘稠的浆糊几秒前
[AtCoder - abc465_d ]X to Y题解
数据结构·c++·算法
誰能久伴不乏1 分钟前
C++11 随机数生成——告别 rand()
开发语言·c++
海清河晏1115 分钟前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio
鱼儿也有烦恼8 分钟前
数据结构合集
算法·algorithm
kuonyuma15 分钟前
java之动态代理
java·开发语言
KouFiee21 分钟前
同名隐藏基础
开发语言·c++
z落落30 分钟前
C# Task WaitAll、WaitAny、WhenAll、WhenAny
开发语言·c#
兰令水31 分钟前
hot100【acm版】【2026.7.11/12打卡-java版本】
java·开发语言·数据结构·算法·职场和发展
研來如此39 分钟前
图像文件大小
人工智能·算法·计算机视觉
千纸鹤安安40 分钟前
开源 Agent 框架实战:用自然语言替代 Crontab 做运维
算法