P10341 [THUSC 2019] 紧急决策

P10341 [THUSC 2019] 紧急决策

思路

贪心思路

分析数据大小,时间复杂度只能是 \(O(n)\)。然后我们可以考虑到最终为了利益最大化,最终一定是每个点亮的灯塔所能照亮的灯塔没有重复的,随后我们便可以依照该思路去贪心了。

代码思路

定义三个变量 \(lst\) 和 \(cnt\) 以及 \(r\)。\(lst\) 代表着目前最前的一个没有被照亮的灯塔的编号,\(cnt\) 是目前已经点亮的灯塔数量,\(r\) 是目前最右边被点亮的位置。顺序遍历的过程中分两种情况讨论:

  1. 已经被照亮了,那么记下答案为该点的编号
  2. 如果未被照亮。如果 \(cnt=t\) 就代表已经没办法在点灯了,直接退出循环。判断是不是当前首个出现的未被点亮的点,记录进 \(lst\) 里。然后要判断该点是否要主动点亮,如果 \(x_i-x_{lst}\le q\) 则代表这能选,反之则代表上一个便是最优解的点。

ACcode

#include <bits/stdc++.h>
using namespace std;
#define freop(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define int long long
#define double long double
#define re register
#define endl '\n'
#define inf 0x7f7f7f7f7f7f7f7f
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define fir first
#define sec second
#define umap unordered_map
#define uset unordered_set
const int N=7.5e6+1;
int n,t,q,r,lst,a[N],cnt,ans=1;

signed main(){
	cin.tie(0)->ios::sync_with_stdio(false);
	cout.tie(0);
//	freop();
//↑以上为初始化↑
//------------------------------
	cin >> n >> t >> q;
	if(!t) cout << 0 << endl;
	for(int i = 1;i<=n;++i) cin >> a[i];
	r=a[1],lst=1;
	for(int i = 2;i<=n;++i){
//		cout << i << ' ' << r << ' ' << cnt << ' ' << lst << endl;
		if(r<a[i]){
			if(!lst) lst=i;
			if(!(cnt^t)){break;}
			if(a[i]-a[lst]>q) --i,++cnt,r=a[i]+q,lst=0;
		}
		if(r>=a[i]) ans=i;
	}
	if(t-cnt) ans=n;
	cout << ans << endl;
	return 0;
}
/*

*/
posted @ 2026-10-21 21:21  elon_giao  阅读(3)  评论(0)    收藏  举报