国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

hihocoder 136 #1269 優化延遲 二分+優先隊列

2019-11-11 04:13:08
字體:
來源:轉載
供稿:網友

描述

小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 385 3 1 2 4樣例輸出

2

思路:對于緩沖區的描述我們一般就直接用優先隊列了 復雜度為O(N*logN)

對于這個題如果我們考慮直接去暴力枚舉緩沖區K的大小,然后在優先隊列去入隊出隊算出 SP值得話, 復雜度為O(N^2logN)N為10^5 復雜度還是很高;我們可以觀察考慮到我們枚舉K的大小時K為單調的,而且我們發現隨著K變大 SP的值在單調遞減,所以我們可以想到二分K的大小

復雜度降為O(N*logN*logN)

#include<bits/stdc++.h>#define ll long long#define N 100010using namespace std;ll n,Q;int p[N];int check(int k){	 PRiority_queue<int> qi;	 while(qi.size())	qi.pop();	 ll sum=0,l=1;	 for(int i=0;i<n;i++)	 {	 	if(qi.size()==k)	 	{	 		int w=qi.top();	 		qi.pop();	 		sum=sum+w*l;			//printf("%d/n",qi.top());			l++;		}			qi.push(p[i]);	 		 }	 while(qi.size())	 {	 	int w=qi.top();	 	qi.pop();	 	sum+=w*l;	 	//printf("%d/n",qi.top());	 	l++;	 		 }	 //printf("%lld/n",sum);	 if(sum<=Q)	 return 1;	 else	 return 0;}int main(){	int i;	while(~scanf("%lld%lld",&n,&Q))	{		for(i=0;i<n;i++)			cin>>p[i];		ll mid,left=1,right=100000;		while(left<=right)		{			mid=(left+right)/2;			if(check(mid))			right=mid-1;			else 			  left=mid+1;		}		if(left>100000)		left=-1;		printf("%lld/n",left);	}	return 0; } 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 承德市| 宝山区| 西林县| 金湖县| 张北县| 盘山县| 滨海县| 依兰县| 陕西省| 元氏县| 惠东县| 镶黄旗| 宁化县| 称多县| 晋江市| 中卫市| 和静县| 伊宁市| 康马县| 三门县| 临洮县| 娱乐| 双鸭山市| 昌宁县| 惠水县| 上蔡县| 朝阳市| 马公市| 武定县| 周宁县| 观塘区| 夏邑县| 策勒县| 肇东市| 策勒县| 靖边县| 梧州市| 开封县| 安远县| 噶尔县| 元阳县|