日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod 1475:建设国家 优先队列的好题

發(fā)布時(shí)間:2024/10/8 编程问答 45 如意码农
生活随笔 收集整理的這篇文章主要介紹了 51nod 1475:建设国家 优先队列的好题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1475 建設(shè)國家
基準(zhǔn)時(shí)間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級(jí)算法題
 收藏
 關(guān)注

小C現(xiàn)在想建設(shè)一個(gè)國家。這個(gè)國家中有一個(gè)首都,然后有若干個(gè)中間站,還有若干個(gè)城市。

現(xiàn)在小C想把國家建造成這樣的形狀:選若干(可以是0個(gè))的中間站把他們連成一條直線,然后把首都連在這一條直線的左端。然后每個(gè)點(diǎn)可以連一個(gè)城市,特別的是最右端的點(diǎn)可以連接兩個(gè)城市。

現(xiàn)在有n個(gè)城市的規(guī)劃供小C選擇。但是,他們那兒的交通條件比較差,他們那兒一天是2*H個(gè)小時(shí),每個(gè)城市里面的人每天都會(huì)去首都拿一樣?xùn)|西,從他們所在的城市出發(fā),到了首都之后拿了東西就走(拿東西的時(shí)間可以忽略不計(jì)),他們要在2*H個(gè)小時(shí)之內(nèi)返回他們自己的家中(從家中出發(fā)到返回家中不超過2*H小時(shí))。

每個(gè)城市有兩個(gè)屬性,一個(gè)是城市的直徑,另外一個(gè)是能居住的人口數(shù)目。對(duì)于第i個(gè)城市而言,這兩個(gè)屬性分別是hi,pi。

城市的直徑的意思是離這個(gè)城市出口最遠(yuǎn)的人想要出城先要在城里行走的最少的時(shí)間。

在首都,中間站,城市之間行走要花費(fèi)1小時(shí)的時(shí)間。

小C想選擇一些城市然后通過若干的中間站和首都連接起來,在每個(gè)人能在2*H小時(shí)返回的條件下所有城市居住的總?cè)丝跀?shù)目要最多。

樣例解釋:最上面的藍(lán)點(diǎn)表示首都,其它的藍(lán)點(diǎn)表示中間站,剩下的紅圈表示選擇的城市。


Input
單組測試數(shù)據(jù)。
第一行包含兩個(gè)整數(shù)n 和H (1 ≤ n ≤ 1000,1 ≤ H ≤ 1000000000),表示可供選擇的城市數(shù)目和時(shí)間限制。
接下來n行,每行有兩個(gè)整數(shù)hi, pi (1 ≤ hi ≤ H, 1 ≤ pi ≤ 1000),第i個(gè)城市的兩個(gè)屬性,即直徑和能容納人口數(shù)。
Output
輸出最多能居住的人口數(shù)目。
Input示例
5 10
1 1
1 1
2 2
3 3
4 4
Output示例
11

我到現(xiàn)在還在想為什么這道題僅僅是20分的一道題,一開始做的時(shí)候題意都沒能完全理解。。。理解了之后發(fā)現(xiàn)情況怎么這么多,要考慮的因素怎么這么多,用優(yōu)先隊(duì)列是肯定的,怎么用都是個(gè)問題。。。最后是一位大神把代碼發(fā)過來,跑了幾次之后,才理解。但現(xiàn)在,對(duì)這道題真的是快要膜拜了,無論是出題人還是寫出這種做法的人,可能是我水平現(xiàn)在太弱了,這個(gè)代碼仔細(xì)想了想,寫得是真的6。膜拜~

將距離按照降序排列,然后在只有滿足當(dāng)前數(shù)量<i的時(shí)候往里面添加元素,彈出來的是當(dāng)前隊(duì)列中的人口最少的城市,隊(duì)列中的是被選中的滿足接下來長度要求的城市,然后在這一輪中添加這個(gè)距離的所有城市,之后如果城市數(shù)量超出,再將人口最少的城市排除。也就是說,隊(duì)列里面是符合長度要求的人口最多且在當(dāng)前狀況下數(shù)量最多的城市。

膜拜大神~

代碼:

#include <iostream>
#include <vector>
#include <queue>
#pragma warning(disable:4996)
using namespace std; const int N = 1005;
int n,H;
vector <int> v[N]; int main()
{
scanf("%d%d",&n,&H);
for(int h,p,i=0;i<n;i++)
{
scanf("%d%d",&h,&p);
int x = min(n,H-h);
v[x].push_back(p);
}
priority_queue<int>q;
int ans = 0;
for(int i=1,s=0;i<=n;i++)
{
for(;q.size()>=i;q.pop())
s+=q.top();
for(auto &p:v[i])
{
q.push(-p);
s += p;
}
for(;q.size()>i+1;q.pop())
{
s += q.top();
}
ans = max(ans,s);
}
printf("%d\n",ans);
}

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的51nod 1475:建设国家 优先队列的好题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。