【题解学习】序列题

参考链接:https://www.luogu.com.cn/problem/solution/P14665

先贴代码,后续补

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int mx,mn,n,m,a[5005];
struct qj{
	int l,r;
};
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	while(1){
		mx=0,mn=1e9;
		for(int i=1;i<=n;i++){
			mx=max(mx,a[i]);
			mn=min(mn,a[i]);
		}
		if(mx==mn||m==0) break;
		bool flag=0;
		int l=0,r=0;
		vector<qj> v1,v2;
		for(int i=1;i<=n;i++){
			if(a[i]==mx){
				flag=1;
				if(l==0) l=i;
				r=i;
			}
			if((a[i]==mn||i==n)&&flag==1){
				v1.push_back(qj{l,r});
				l=0,r=0;	
				flag=0;	
			}
		}
		for(int i=1;i<=n;i++){
			if(a[i]==mn){
				flag=1;
				if(l==0) l=i;
				r=i;
			}
			if((a[i]==mx||i==n)&&flag==1){
				v2.push_back(qj{l,r});
				l=0,r=0;
				flag=0;		
			}
		}
		int cnt1=v1.size(),cnt2=v2.size();
		if(cnt1<cnt2){
			if(m>=cnt1) {
				m-=cnt1;
				for(int i=0;i<cnt1;i++){
					for(int j=v1[i].l;j<=v1[i].r;j++) a[j]--;
				}
			}
			else break;
		}
		else{
			if(m>=cnt2) {
				m-=cnt2;
				for(int i=0;i<cnt2;i++){
				for(int j=v2[i].l;j<=v2[i].r;j++) a[j]++;
				}
			}
			else break;
		}
	}
	mx=0,mn=1e9;
	for(int i=1;i<=n;i++){
		mx=max(mx,a[i]);
		mn=min(mn,a[i]);
	}
	cout<<mx-mn;
	return 0;
} 
相关推荐
地平线开发者3 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮3 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者4 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考4 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx7 小时前
CART决策树基本原理
算法·机器学习
Wect8 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱8 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway15 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风15 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect15 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript