[Offer收割]程式設計練習賽1 hihocoder 1269 優化延遲 (二分+優先權佇列)
描述
小Ho編寫了一個處理資料包的程式。程式的輸入是一個包含N個資料包的序列。每個資料包根據其重要程度不同,具有不同的"延遲懲罰值"。序列中的第i個資料包的"延遲懲罰值"是Pi。如果N個資料包按照<Pi1, Pi2, ... PiN>的順序被處理,那麼總延遲懲罰
SP=1*Pi1+2*Pi2+3*Pi3+...+N*PiN(其中i1, i2, ... iN是1, 2, 3, ... N的一個排列)。
小Ho的程式會依次處理每一個資料包,這時N個資料包的總延遲懲罰值SP為
1*P1+2*P2+3*P3+...+i*Pi+...+N*PN。
小Hi希望可以降低總延遲懲罰值。他的做法是在小Ho的程式中增加一個大小為K的緩衝區。N個資料包在被處理前會依次進入緩衝區。當緩衝區滿的時候會將當前緩衝區內"延遲懲罰值"最大的資料包移出緩衝區並進行處理。直到沒有新的資料包進入緩衝區時,緩衝區內剩餘的資料包會按照"延遲懲罰值"從大到小的順序被依次移出並進行處理。
例如,當資料包的"延遲懲罰值"依次是<5, 3, 1, 2, 4>,緩衝區大小K=2時,資料包被處理的順序是:<5, 3, 2, 4, 1>。這時SP=1*5+2*3+3*2+4*4+5*1=38。
現在給定輸入的資料包序列,以及一個總延遲懲罰閾值Q。小Hi想知道如果要SP<=Q,緩衝區的大小最小是多少?
輸入
Line 1: N Q
Line 2: P1 P2 ... PN
對於50%的資料: 1 <= N <= 1000
對於100%的資料: 1 <= N <= 100000, 0 <= Pi <= 1000, 1 <= Q <= 1013
輸出
輸出最小的正整數K值能滿足SP<=Q。如果沒有符合條件的K,輸出-1。
5 38
5 3 1 2 4
樣例輸出
2
題目連結: http://hihocoder.com/problemset/problem/1269
題目分析:因為可以發現K越大,SP的值越小,所以可以二分K值,priority_queue模擬過程,判斷即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define ll long long
using namespace std;
int const MAX = 100005;
int n;
ll p[MAX], pp[MAX], Q, sum;
bool judge(int x)
{
priority_queue <ll> q;
int i = 1;
ll cnt = 1;
sum = 0;
while(i <= n)
{
while(i <= n && (int) q.size() != x)
q.push(p[i ++]);
sum += cnt * q.top();
q.pop();
cnt ++;
if(i == n + 1)
{
while(!q.empty())
{
sum += cnt * q.top();
q.pop();
cnt ++;
}
}
}
return sum <= Q;
}
int main()
{
ll tmp = 0;
scanf("%d %lld", &n, &Q);
for(int i = 1; i <= n; i++)
scanf("%lld", &p[i]);
memcpy(pp, p, sizeof(p));
sort(pp + 1, pp + n + 1);
for(int i = 1; i <= n; i++)
tmp += pp[i] * (n - i + 1);
if(tmp > Q)
{
printf("-1\n");
return 0;
}
int l = 1, r = MAX, mid, ans;
while(l <= r)
{
mid = (l + r) >> 1;
if(judge(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%d\n", ans);
}
相關文章
- [Offer收割]程式設計練習賽1 hihocoder 1268 九宮 (DFS)程式設計
- [Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)程式設計
- [Offer收割]程式設計練習賽2 hihocoder 1273 (DFS + 狀壓)程式設計
- [Offer收割]程式設計練習賽1 hihocoder 1271 艦隊遊戲 (狀態壓縮+貪心 好題)程式設計遊戲
- [Offer收割]程式設計練習賽2 hihocoder 1275 掃地機器人 (計算幾何+模擬 比較煩)程式設計機器人
- [Offer收割]程式設計練習賽2 hihocoder 1272 買零食 (DFS 或 dp 水題)程式設計
- 01揹包優先佇列優化佇列優化
- 分散式佇列程式設計優化篇分散式佇列程式設計優化
- RecyclerView 效能優化 | 安卓 offer 收割基View優化安卓
- PHP優先佇列PHP佇列
- 堆--優先佇列佇列
- 優先佇列 (轉)佇列
- Timestone:Netflix 的高吞吐量、低延遲優先佇列系統佇列
- HDU4546 比賽難度 (優先佇列)佇列
- Laravel 延遲佇列Laravel佇列
- redis 延遲佇列Redis佇列
- 高可用延遲佇列設計與實現佇列
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- 淺談優先佇列佇列
- STL 優先佇列 用法佇列
- 堆與優先佇列佇列
- 堆和優先佇列佇列
- 延遲阻塞佇列 DelayQueue佇列
- hyperf redis延遲佇列Redis佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 優先佇列和堆排序佇列排序
- 堆排序與優先佇列排序佇列
- Java優先佇列(PriorityQueue)示例Java佇列
- MySQL Slave延遲很大優化方法MySql優化
- RabbitMQ實戰《延遲佇列》MQ佇列
- RabbitMQ實現延遲佇列MQ佇列
- RabbitMQ 實現延遲佇列MQ佇列
- [Redis]延遲訊息佇列Redis佇列
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- 二叉堆優先佇列佇列