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

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

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

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

描述

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

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

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

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

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

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

現(xiàn)在給定輸入的數(shù)據(jù)包序列,以及一個(gè)總延遲懲罰閾值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)先隊(duì)列了 復(fù)雜度為O(N*logN)

對于這個(gè)題如果我們考慮直接去暴力枚舉緩沖區(qū)K的大小,然后在優(yōu)先隊(duì)列去入隊(duì)出隊(duì)算出 SP值得話, 復(fù)雜度為O(N^2logN)N為10^5 復(fù)雜度還是很高;我們可以觀察考慮到我們枚舉K的大小時(shí)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ā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石阡县| 云龙县| 彭泽县| 鲁甸县| 盐城市| 沈阳市| 垦利县| 桑植县| 且末县| 阳朔县| 清水县| 嘉鱼县| 普陀区| 万全县| 廉江市| 香河县| 万年县| 厦门市| 马尔康县| 蒙山县| 遵义县| 横山县| 明光市| 桂阳县| 东莞市| 宜良县| 郧西县| 南昌市| 政和县| 东丰县| 称多县| 咸丰县| 白城市| 古田县| 呼图壁县| 新蔡县| 福鼎市| 旬阳县| 台中县| 安吉县| 郸城县|