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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

hihocoder 136 #1269 優(yōu)化延遲 二分+優(yōu)先隊列

2019-11-11 04:55:07
字體:
供稿:網(wǎng)友

描述

小Ho編寫了一個處理數(shù)據(jù)包的程序。程序的輸入是一個包含N個數(shù)據(jù)包的序列。每個數(shù)據(jù)包根據(jù)其重要程度不同,具有不同的"延遲懲罰值"。序列中的第i個數(shù)據(jù)包的"延遲懲罰值"是Pi。如果N個數(shù)據(jù)包按照<Pi1, Pi2, ... PiN>的順序被處理,那么總延遲懲罰

SP=1*Pi1+2*Pi2+3*Pi3+...+N*PiN(其中i1, i2, ... iN是1, 2, 3, ... N的一個排列)。

小Ho的程序會依次處理每一個數(shù)據(jù)包,這時N個數(shù)據(jù)包的總延遲懲罰值SP為

1*P1+2*P2+3*P3+...+i*Pi+...+N*PN。  

小Hi希望可以降低總延遲懲罰值。他的做法是在小Ho的程序中增加一個大小為K的緩沖區(qū)。N個數(shù)據(jù)包在被處理前會依次進(jìn)入緩沖區(qū)。當(dāng)緩沖區(qū)滿的時候會將當(dāng)前緩沖區(qū)內(nèi)"延遲懲罰值"最大的數(shù)據(jù)包移出緩沖區(qū)并進(jìn)行處理。直到?jīng)]有新的數(shù)據(jù)包進(jìn)入緩沖區(qū)時,緩沖區(qū)內(nèi)剩余的數(shù)據(jù)包會按照"延遲懲罰值"從大到小的順序被依次移出并進(jìn)行處理。

例如,當(dāng)數(shù)據(jù)包的"延遲懲罰值"依次是<5, 3, 1, 2, 4>,緩沖區(qū)大小K=2時,數(shù)據(jù)包被處理的順序是:<5, 3, 2, 4, 1>。這時SP=1*5+2*3+3*2+4*4+5*1=38。

現(xiàn)在給定輸入的數(shù)據(jù)包序列,以及一個總延遲懲罰閾值Q。小Hi想知道如果要SP<=Q,緩沖區(qū)的大小最小是多少?

輸入

Line 1: N Q

Line 2: P1 P2 ... PN

對于50%的數(shù)據(jù): 1 <= N <= 1000

對于100%的數(shù)據(jù): 1 <= N <= 100000, 0 <= Pi <= 1000, 1 <= Q <= 1013

輸出

輸出最小的正整數(shù)K值能滿足SP<=Q。如果沒有符合條件的K,輸出-1。

樣例輸入
5 385 3 1 2 4樣例輸出

2

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

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

復(fù)雜度降為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; } 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 和顺县| 凤台县| 大城县| 饶阳县| 香河县| 贵州省| 全椒县| 北海市| 循化| 三原县| 巴马| 区。| 和田市| 通山县| 乌海市| 嘉兴市| 塔河县| 虎林市| 顺平县| 镇康县| 虹口区| 红河县| 三都| 海丰县| 辉南县| 三亚市| 弥勒县| 美姑县| 右玉县| 宜章县| 玉林市| 尉氏县| 德清县| 金乡县| 虹口区| 余庆县| 宝坻区| 遵义市| 类乌齐县| 罗山县| 共和县|