hihoCoder #1269 : 优化延迟 【二分 + 优先队列】

来源:互联网 发布:阿里云ecs安装docker 编辑:程序博客网 时间:2024/04/20 20:24

题目链接:hihoCoder #1269 : 优化延迟

思路:二分然后维护一个priorityqueueO了。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#define PI acos(-1.0)#define CLR(a, b) memset(a, (b), sizeof(a))#define fi first#define se secondusing namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1e5+10;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;void getmax(int &a, int b) {a = max(a, b); }void getmin(int &a, int b) {a = min(a, b); }void add(LL &x, LL y) { x += y; x %= MOD; }priority_queue<int, vector<int>, less<int> > Q;int N; LL S;int a[MAXN];LL Count(int o){    LL ans = 0;    int i = 1, j = 1;    while(i <= N)    {        while(Q.size() < o && i <= N) {            Q.push(a[i]), i++;        }        int v = Q.top(); Q.pop();        ans += 1LL * v * j; j++;    }    while(!Q.empty())    {        int v = Q.top(); Q.pop();        ans += 1LL * v * j; j++;    }    return ans;}int main(){    while(scanf("%d%lld", &N, &S) != EOF)    {        for(int i = 1; i <= N; i++) scanf("%d", &a[i]);        int l = 1, r = N;        int ans = -1;        while(r >= l)        {            int mid = (l + r) >> 1;            if(Count(mid) <= S)            {                ans = mid;                r = mid-1;            }            else                l = mid+1;        }        cout << ans << endl;    }    return 0;}
0 0
原创粉丝点击