2186 猴子拆房

2021-08-06 06:34:08 字數 1401 閱讀 2485

這一道題有點難度

我們可以想到,我們可以列舉最高樓房。

那麼需要的費用就是:所有比它高的樓房的錢數和+比它矮的但又不得不刪掉的錢數和。

前面那乙個很簡單就可以求出來,後面那乙個我們可以用堆來做。

首先,我們排一下序。

然後我們建乙個堆,先把所有數都加進去。

然後,我們開始從高往低列舉

我們先把當前點前面的點給刪掉。

然後,假如高度等於當前列舉的樓房高度的個數為k,那麼我們就把可以儲存k-1個數全都刪掉。

然後我們算一下su

m=所有

剩下的數

的和。 如果s

um+所

有比它高

的樓房的錢數和

s ,那麼我們就更新ans。

然後,我們再把刪掉的數給加回來(以後還會用到的)。

這裡有乙個問題,就是如果sum乙個乙個算會很耗費時間,所以我們要邊做變加減。

就是在插入乙個數的時候,我們把sum+x(x為當前所插入的點的權值),反之亦然。

#include
#include

#include

using namespace std;

struct node

tr[110000];

int a[110000],b[110000],c[110000],d[110000];

int hz[110000],sum=0,e[110000];int ans=0;

int cmp(const void *xx,const void *yy)

int mymin(int

x,int

y) void up(intx)}

void down(int

x) else

}}void insert(int

x,int id)

void dec(int

x) else

}int main()

qsort(tr+1,n,sizeof(node),cmp);

tr[n+1].h=-1;int temp=0;hz[0]=0;

for(int i=1;i<=n;i++)

dec(c[1]);

int min=999999999;

for(int i=2;i<=n+1;i++)

if(ans+hz[temp]for(int j=1;j<=temp2;j++)

temp=i-1;

}dec(c[i]);

}printf("%d\n",min);

return

0;}

poj2186 解題報告

題意 有一些奶牛,他們之間有互相崇拜的關係,並且這個關係是有傳遞性的,求被所有奶牛崇拜的奶牛數量 題解 先用強連通縮點,把強連通分量縮成乙個點,強連通中的點必然是互相崇拜的,然後再縮點後的圖中找 到出度為零的點,如果這些點的數量大於一,那麼必然沒有解,因為這些點直接沒有互相崇拜關係,如果只有 乙個點...

poj2186 解題報告

題意 有一些奶牛,他們之間有互相崇拜的關係,並且這個關係是有傳遞性的,求被所有奶牛崇拜的奶牛數量 題解 先用強連通縮點,把強連通分量縮成乙個點,強連通中的點必然是互相崇拜的,然後再縮點後的圖中找 到出度為零的點,如果這些點的數量大於一,那麼必然沒有解,因為這些點直接沒有互相崇拜關係,如果只有 乙個點...

poj 2186 強連通縮點

題意 有n只奶牛,奶牛有自己認為最受歡迎的奶牛。奶牛們的這種 認為 是單向可傳遞的,當a認為b最受歡迎 b不一定認為a最受歡迎 且b認為c最受歡迎時,a一定也認為c最受歡迎。現在給出m對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了...