【题解学习】序列题

参考链接: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;
} 
相关推荐
To_OC1 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安6 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者8 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy14 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC1 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥1 天前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程