2021牛客寒假算法基础集训营3 B内卷(优先队列+尺取法)。经典@@!

这篇博客介绍了一种使用优先队列解决ACM竞赛中枚举法问题的方法。作者通过一个具体的题目实例,解释了如何枚举最小值,并在每一步中选取与当前最小值差值最小的数,同时处理边界条件。博客还强调了在编程中直接使用pair和优先队列(默认大顶堆)的便利性,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:https://ac.nowcoder.com/acm/contest/9983/B

题解:枚举法--枚举最小值,然后其他每组选择与其差值最小的数即可。

具体见兰子哥哥

翻译:最开始,魅族都选最小的只,就相当于以最小的数作为最小的数的最优解,然后不断增大最小值(下限),每次在更新一下ans=min(ans,mx-mi)即可。

边界处理:j-1==0是或者cnt(取A的个数)==k+1时跳出循环。

总结:能直接用pair就直接用。优先队列:默认大顶堆,less大,greater小(直接试也可)。

代码:

#include <bits/stdc++.h>

#define ll long long
#define pi acos(-1)
#define pb push_back
#define mst(a, i) memset(a, i, sizeof(a))
#define pll pair<ll, ll>
#define fi first
#define se second
#define mp(x, y) make_pair(x, y)
#define rep(i, a, n) for (ll i = a; i <= n; i++)
#define per(i, n, a) for (ll i = n; i >= a; i--)
#define dbg(x) cout << #x << "===" << x << endl
#define dbgg(l, r, x) for(ll i=l;i<=r;i++)cout<<x[i]<<" ";cout<<"<<<"<<#x;cout<<endl
//多动脑,少动笔
using namespace std;

template<class T>void read(T &x){T res=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){res=(res<<3)+(res<<1)+c-'0';c=getchar();}x=res*f;}
void Printf(ll x){if(x<0){putchar('-');x=-x;}if(x>9)Printf(x/10);putchar(x%10+'0');}
void print(ll x,char c){Printf(x),putchar(c);}
const ll maxn = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll inf = 1e9;
#define plll pair<ll,pll >


ll cnt=0,ans=1e18,mx=0;
priority_queue<plll,vector<plll >,greater<plll> > q;
ll a[maxn][10],n,k;
void DBG(){
    while(!q.empty()){
        pair<ll,pll > now=q.top();q.pop();
        cout<<">>>"<<now.fi<<" "<<now.se.fi<<" "<<now.se.se<<'\n';
    }
}
int main()
{
    //freopen("testdata.in","r",stdin);
    //freopen("testout.out","w",stdout);
    ll TT=1;
    // read(TT);
    while(TT--){
        read(n),read(k);
        rep(i,1,n){
            rep(j,1,5){
                read(a[i][j]);
            }
            q.push({a[i][5],{i,5}});
            mx=max(mx,a[i][5]);
        }
        // DBG();
        ans=min(ans,mx-q.top().first);
        // dbg(ans);
        while(!q.empty()){
            ll k0,i=q.top().second.first,j=q.top().second.second;
            q.pop();
            // 
            if(j==1) break;
            if(j==2) cnt++;
            if(cnt==k+1) break;
            k0=a[i][j-1];
            mx=max(k0,mx);
            q.push({k0,{i,j-1}});
            ll k1=q.top().first;
            ans=min(ans,mx-k1);
            // dbg(mx),dbg(k1);
            // if(cnt==k) break;
        }
        print(ans,'\n');
    }
    return 0;
}

 

内容概要:本文详细介绍了基于结构不变补偿的电液伺服系统低阶线性主动干扰抑制控制(ADRC)方法的实现过程。首先定义了电液伺服系统的基本参数,并实现了结构不变补偿(SIC)函数,通过补偿非线性项和干扰,将原始系统转化为一阶积分链结构。接着,设计了低阶线性ADRC控制器,包含扩展状态观测器(ESO)和控制律,用于估计系统状态和总干扰,并实现简单有效的控制。文章还展示了系统仿真与对比实验,对比了低阶ADRC与传统PID控制器的性能,证明了ADRC在处理系统非线性和外部干扰方面的优越性。此外,文章深入分析了参数调整与稳定性,提出了频域稳定性分析和b0参数调整方法,确保系统在参数不确定性下的鲁棒稳定性。最后,文章通过综合实验验证了该方法的有效性,并提供了参数敏感性分析和工程实用性指导。 适合人群:具备一定自动化控制基础,特别是对电液伺服系统和主动干扰抑制控制感兴趣的科研人员和工程师。 使用场景及目标:①理解电液伺服系统的建模与控制方法;②掌握低阶线性ADRC的设计原理和实现步骤;③学习如何通过结构不变补偿简化复杂系统的控制设计;④进行系统仿真与实验验证,评估不同控制方法的性能;⑤掌握参数调整与稳定性分析技巧,确保控制系统在实际应用中的可靠性和鲁棒性。 阅读建议:本文内容详尽,涉及多个控制理论和技术细节。读者应首先理解电液伺服系统的基本原理和ADRC的核心思想,然后逐步深入学习SIC补偿、ESO设计、控制律实现等内容。同时,结合提供的代码示例进行实践操作,通过调整参数和运行仿真,加深对理论的理解。对于希望进一步探索的读者,可以关注文中提到的高级话题,如频域稳定性分析、参数敏感性分析等,以提升对系统的全面掌控能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值