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

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

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

2019-11-11 03:44:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(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的程序會(huì)依次處理每一個(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ù)包在被處理前會(huì)依次進(jìn)入緩沖區(qū)。當(dāng)緩沖區(qū)滿的時(shí)候會(huì)將當(dāng)前緩沖區(qū)內(nèi)"延遲懲罰值"最大的數(shù)據(jù)包移出緩沖區(qū)并進(jìn)行處理。直到?jīng)]有新的數(shù)據(jù)包進(jìn)入緩沖區(qū)時(shí),緩沖區(qū)內(nèi)剩余的數(shù)據(jù)包會(huì)按照"延遲懲罰值"從大到小的順序被依次移出并進(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

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

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

輸出

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

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

2

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

對(duì)于這個(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; } 


上一篇:PAT BASIC 1009

下一篇:PAT BASIC 1009

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 哈巴河县| 芮城县| 乳山市| 福建省| 昭平县| 淳安县| 景东| 同江市| 达拉特旗| 新蔡县| 新竹市| 延川县| 兖州市| 宜君县| 镇坪县| 南部县| 合山市| 石狮市| 南靖县| 衡东县| 策勒县| 灵宝市| 喀喇| 磴口县| 滨州市| 炎陵县| 武定县| 沧州市| 鄂尔多斯市| 彝良县| 嘉禾县| 商丘市| 崇信县| 甘泉县| 乃东县| 全南县| 黄龙县| 江口县| 正宁县| 双柏县| 贵德县|