hihoCoder #1269 : 优化延迟 【二分 + 优先队列】
2016-03-12 19:00
405 查看
题目链接:hihoCoder #1269 : 优化延迟
思路:二分然后维护一个priorityqueue就O了。
AC代码:
思路:二分然后维护一个priorityqueue就O了。
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 second using 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; }
相关文章推荐
- hihoCoder #1268 : 九宫 【DFS】
- 第三周项目4:穷举法解决组合问题---换分币
- 工厂设计模式--确定对话框
- nodejs--Nodejs单元测试小结
- 学习进度表01
- myeclipse常用快捷键总结
- linux下安装mysql5.6
- hdoj 1896 Stones 【优先队列】
- 网络与安全方面的最佳开源软件
- hdoj 1716 排列2 【STL】
- java设计模式——结构型之组合模式
- MySQL集群
- 67.迷宫问题(广搜)
- javascript--给你的JS代码添加单元测试
- 小学四则运算题目自动生成
- 构建之法阅读笔记01
- 67.迷宫问题(广搜)
- 67.迷宫问题(广搜)
- linux centos 常用命令
- UIButton