貪心演算法poj 3617,3069,3253

2021-08-05 00:02:16 字數 1501 閱讀 1021

想法:先生成乙個反著的字串,(其實就是從兩邊開始找)先取出兩邊相比較小的字串。當然這裡有個問題,就是兩邊的頭乙個字元相同時,比較下乙個字元,直到比較完整個字串為止,找到較小的那邊的第乙個字元加上。其實用strcmp就可以很好的解決上面描述的操作。

code:

#include 

#include

#include

using

namespace

std;

int main(void)

s=srev;

reverse(srev.begin(),srev.end());

while(pos1+pos2if(strcmp(&s[pos1],&srev[pos2])<0)

else

}for(int i=0;icout

}}

想法:對於這題同樣可以應用貪心的思想,我們盡量讓選擇的點盡可能的向右移,也就是在滿足包含最左邊需要的點的前提下尋找距離該點最遠的點作為標記點。這樣就可以滿足最小化標記點數。

code:

#include

#include

using namespace std;

int main(void)

sort(point,point+n);

needleft=point[pos];

while(pos

while(point[pos]-r<=needleft)

markedpos=point[pos-1];

count++;

while(point[pos]<=markedpos+r)

needleft=point[pos];

}cout<想法:講道理這題我原來在vijos上見過,好像叫最小合併代價。。。反正從貪心的角度來考慮的話就是先合併比較小的,然後總是合併比較小的木塊,這樣就可以保證總代價最小,書上的考慮方法是用樹來解決的,如果把分割的過程畫成個樹的話那麼最後的代價就是每個最下面的子節點的大小*節點的深度。那麼不難想我們只要讓越小的越望下面放就行了,反過來從合成的角度來說的話就是每次合成較小的兩個木塊。

code.

#include

#include

using

namespace

std;

long

long wood[20005];

int main(void)

sort(wood,wood+n);

for(int i=0;i1]+=wood[i];

if(i!=n-1)

ans+=wood[i+1];

for(int j=i+2;jif(wood[j]1])

else}}

cout

<}

POJ 1328 貪心演算法

雷達安裝 時間限制 1000ms 記憶體限制 10000k 提交總數 109120 接受 24128 描述 假設滑行是無限直線。土地位於海岸的一側,海洋位於另一側。每個小島都位於海邊。並且任何位於滑行的雷達裝置只能覆蓋d距離,因此如果它們之間的距離最多為d 則可以通過半徑裝置覆蓋海中的島嶼。我們使用...

POJ1201(貪心演算法)

給出n個閉整數區間 ai,bi 和n個整數c1,cn。編寫乙個程式 從標準輸入讀取間隔的數目 它們的端點和整數c1 cn,計算具有區間 ai,bi 的至少ci公共元素的整數集z的最小大小,對於每乙個i 1,2,n,將答案寫入標準輸出。輸入輸入的第一行包含整數n 1 n 50000 間隔數。下面n行描...

poj 1042 貪心演算法

poj 1042 gone fishing 題目要求 由有n個湖,按照順序排列,乙個人從第乙個湖向最後乙個湖行進 方向只能從湖0到湖n 1 途中可以在湖中釣魚。在每個湖中釣魚時,開始的5分鐘內可以釣到 f i 條,之後每5分鐘釣到的魚數目遞減 d i 且每兩個相鄰的湖的距離 t i 給出 t i 表...