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;
}
相关推荐
君顾16 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠6 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
南棱笑笑生6 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
指掀涛澜天下惊7 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
平头哥技术团队7 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++7 小时前
【洛谷】kmp算法
开发语言·算法
禹凕7 小时前
Dijkstra算法详解与应用
python·算法
传奇开心果编程7 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743877 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
Draw Stars7 小时前
Git BASH安装教程
开发语言·git·bash