牛客单调队列优化dp刷题小记

烽火传递

#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int a[maxn],dp[maxn],n,m,ans=0x3f3f3f3f;
deque<int> dq; 
int main(){
	cin>>n>>m;
	dq.push_back(0);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		while(dq.size()&&i-dq.front()>m) dq.pop_front();
		dp[i]=dp[dq.front()]+a[i];
		while(dq.size()&&dp[dq.back()]>dp[i]) dq.pop_back();
		dq.push_back(i);
		if(i>=n-m+1) ans=min(dp[i],ans);
	}
	cout<<ans;
	return 0;
}

修剪草坪

#include<bits/stdc++.h>
using namespace std;
long long n,m,e[100005];
long long dp[100005],s;
long long ans=1e18;
deque<int> dq;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>e[i];
		s+=e[i];
	} 
	dq.push_back(0);
	for(int i=1;i<=n;i++){
		while(dq.size()&&i-dq.front()>m+1) dq.pop_front();
		dp[i]=dp[dq.front()]+e[i];
		while(dq.size()&&dp[i]<dp[dq.back()]) dq.pop_back();
		dq.push_back(i);
		if(i>n-m-1) ans=min(ans,dp[i]);
	}
	cout<<s-ans;
    return 0;
}
网是实用的SQL网站,提供一站式求职学习资源,全部免费,适合练习SQL的同学。其型多变,能满足练习求职需求,还有解专区和讨论区,有大神提供解思路,对新手友好,不清楚语法或不理解的地方,可参考他人思路和代码 [^1]。 在方法上,可结合其他平台制定分阶段规划策略。聚焦数据库学习的三大平台 SQLZOO、LeetCode 和网,分阶段从基础入门到进阶提升,再到实战冲刺,还可运用针对性技巧,如语法巩固、逻辑拆解、场景模拟等,以高效掌握 SQL 技能 [^2]。 网也有具体 SQL 目解析示例,例如开窗函数求最晚日期、求初始注册日留存率等,可参考这些示例学习解思路 [^3]。 ```sql -- 开窗函数分组求最大时间,然后用子查询筛选 select n.un u_n, n.cn c_n,n.d from( select u.name un , c.name cn , l.date, (max(l.date) over(partition by l.user_id)) d from login l,user u,client c where l.user_id=u.id and c.id=l.client_id ) n where n.date=n.d order by u_n; -- 使用开窗函数求初始注册日留存率 select round( ( select count(*) -- 通过where找到第二天仍然登陆的用户记录数 from ( select -- 1找到初始登陆日期 user_id ,l.date ,min(date) over(partition by user_id) as first_date from login l ) as temp1 where temp1.date = date_add(first_date,interval 1 day) ) / ( -- 统计用户总数 select count(distinct user_id) from login ) ,3) as p -- 使用where子查询求初始注册日留存率 SELECT ROUND( COUNT(DISTINCT user_id)*1.0 /( -- 总用户量 SELECT COUNT(DISTINCT user_id) FROM login ) , 3) FROM login WHERE (user_id, date) -- 筛选出所有第二天登陆的用户 IN ( -- 如果第二天登陆的日期和id SELECT user_id , DATE_ADD(MIN(date),INTERVAL 1 DAY) FROM login GROUP BY user_id ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值