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;
}
相关推荐
坊钰4 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang19 分钟前
leetcode hot100 LRU缓存
java·开发语言
时雨h24 分钟前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
巫师不要去魔法部乱说32 分钟前
PyCharm专项训练4 最小生成树算法
算法·pycharm
云计算DevOps-韩老师41 分钟前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染1 小时前
Python 正则表达式
开发语言·python
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
小爬虫程序猿1 小时前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫
阿七想学习1 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
xlsw_1 小时前
java全栈day21--Web后端实战之利用Mybaits查询数据
java·开发语言