【题解学习】序列题

参考链接: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;
} 
相关推荐
小程故事多_806 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121978 小时前
二分算法(知识点+题目)
c++·算法
咸鱼翻身小阿橙10 小时前
现在这个四通道出现的问题
学习
AndrewHZ11 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场11 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
云贝教育-郑老师12 小时前
OceanBase 是如何搞定海量数据分片(Sharding)的?
学习·oceanbase·dba
冻柠檬飞冰走茶12 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
编程圈子12 小时前
电机驱动开发学习23. 保护体系与故障状态机
驱动开发·学习
玖玥拾12 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI13 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法