观察一下可以发现,d产生的消耗只与最后一次电影的观看位置有关。设1 <= i <= n,那么由d产生的消耗就是i * d。同时能从1 ~ i 中取得的回报是这段区间里最大的m个正数。用一个优先队列维护最大的m个正数,用val维护d产生的消耗与最大的m个正数产生的回报,记录所有位置的最大值,最后判断一下最大值是否大于0, 否则就执行一场电影都不看的策略,答案为0。遍历数组的时间为O(n),每次维护的时间为O(log m),总时间复杂度为O(n * log m)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 void solve(){ 6 ll n, m, d; 7 cin >> n >> m >> d; 8 vector<ll> a(n); 9 for(int i = 0; i < n; i++){ 10 cin >> a[i]; 11 } 12 13 priority_queue<ll, vector<ll>, greater<ll>> que; 14 ll ans = 0; 15 ll val = 0; 16 for(int i = 0; i < n; i++){ 17 if(a[i] > 0){ 18 que.push(a[i]); 19 val += a[i]; 20 } 21 while(que.size() > m){ 22 val -= que.top(); 23 que.pop(); 24 } 25 26 val -= d; 27 ans = max(ans, val); 28 } 29 30 if(ans < 0){ 31 ans = 0; 32 } 33 cout << ans << endl; 34 } 35 36 int main(){ 37 int t = 1; 38 cin >> t; 39 while(t--){ 40 solve(); 41 } 42 }
标签:Kolya,val,int,Movie,ll,que,ans,Theatre From: https://www.cnblogs.com/kurish/p/17662369.html