P10341 [THUSC 2019] 紧急决策
P10341 [THUSC 2019] 紧急决策
思路
贪心思路
分析数据大小,时间复杂度只能是 \(O(n)\)。然后我们可以考虑到最终为了利益最大化,最终一定是每个点亮的灯塔所能照亮的灯塔没有重复的,随后我们便可以依照该思路去贪心了。
代码思路
定义三个变量 \(lst\) 和 \(cnt\) 以及 \(r\)。\(lst\) 代表着目前最前的一个没有被照亮的灯塔的编号,\(cnt\) 是目前已经点亮的灯塔数量,\(r\) 是目前最右边被点亮的位置。顺序遍历的过程中分两种情况讨论:
- 已经被照亮了,那么记下答案为该点的编号
- 如果未被照亮。如果 \(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;
}
/*
*/

浙公网安备 33010602011771号