【题解学习】序列题

参考链接: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;
} 
相关推荐
H_老邪5 分钟前
spring boot 学习之路-1.0
spring boot·后端·学习
哎嗨人生公众号13 分钟前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶
foundbug99917 分钟前
STM32 内部温度传感器测量程序(标准库函数版)
stm32·单片机·嵌入式硬件·算法
Hello.Reader17 分钟前
为什么学线性代数(一)
线性代数·算法·机器学习
_深海凉_24 分钟前
LeetCode热题100-找到字符串中所有字母异位词
算法·leetcode·职场和发展
东京老树根27 分钟前
SAP学习笔记 - BTP SAP Build02 - Deploy,开始URL,Approve,Reject,履历确认,Log,Context
笔记·学习
木井巳28 分钟前
【递归算法】目标和
java·算法·leetcode·决策树·深度优先
旖-旎35 分钟前
哈希表(字母异位次分组)(5)
数据结构·c++·算法·leetcode·哈希算法·散列表
别或许41 分钟前
4、高数----一元函数微分学的计算
人工智能·算法·机器学习
_深海凉_1 小时前
LeetCode热题100-最长连续序列
算法·leetcode·职场和发展