uva11400 照明系統設計

2021-08-14 20:58:07 字數 2398 閱讀 8266

通過這個題目我以為我了發現資料結構課本快排**的乙個bug。

書上的快排**:

template

void quicksort(t a, int leftend, int rightend)

while (a[leftcursor] < pivot);

dowhile (a[rightcursor] > pivot);

if (leftcursor >= rightcursor) break; // swap pair not found

swap(a[leftcursor], a[rightcursor]);

}// place pivot

a[leftend] = a[rightcursor];

a[rightcursor] = pivot;

quicksort(a, leftend, rightcursor - 1); // sort left segment

quicksort(a, rightcursor + 1, rightend); // sort right segment

}

我是直接照抄書上的**用的,結果提交到oj總是出現re的錯誤。我仔細研究後發現

do

while (a[leftcursor] < pivot);

這段**中沒有檢驗leftcursor是否越界。比如陣列是10 9 8的時候leftcursor就會到8右面沒有元素的位置。我以為這是作者的乙個遺漏,仔細研究後發現這段快排**是由另一段驅動程式所呼叫的。

template void quicksort(t a, int n)

上面這段**先是把陣列中最大的乙個元素放到了最後面,這樣就保證了leftcursor不會超出陣列右邊界。而不通過這個程式呼叫快排**,則每次dowhile迴圈中都要額外判斷一次leftcursor是否越界,會降低程式效能。這就是作者的高明之處哇。

但是實際比賽中不實際,如果要這麼做的話一共要寫三段**,我的做法只加乙個語句就夠了,而且效果根據資料的不同也不一定差。比如這個題目我的耗時60ms,換上作者的**耗時80ms,也可能是我沒掌握精髓吧。但感覺實際耗時還是和資料有關。

#include

#include

#include

#include

#include

#define maxn 1000+5

#define inf 1000000000

using

namespace

std;

int n;

struct node

;node lamps[maxn];

int s[maxn];

int d[maxn];

bool

operator

<(node& node1,node& node2)

void fun()

d[i]=min;

}}void swap(node& node1,node& node2)

void quicksort(int leftend,int rightend)

while(lamps[leftcursor]do

while(lamps[rightcursor]>pivot);

if(leftcursor>=rightcursor)break;

swap(lamps[leftcursor],lamps[rightcursor]);

}lamps[leftend]=lamps[rightcursor];

lamps[rightcursor]=pivot;

quicksort(leftend,rightcursor-1);

quicksort(rightcursor+1,rightend);

}int main()

quicksort(1,n);

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

s[i]=s[i-1]+lamps[i].num;

fun();

printf("%d\n",d[n]);

scanf("%d",&n);

}

}

其實直接用sort函式效率也不低。就不需要自己寫快排了。

sort函式的話只需要我過載乙個小於號運算子就可以了。(過載在類內類外都可以)第乙個形參是需要排序的第乙個元素索引。第二個形參是最後乙個需排序元素的後一位。

今天還發現乙個強大的swap函式,不管陣列元素什麼型別,只要給出陣列名、交換元素就可以完成交換。比如:swap(lamps【i】,lamps【j】)。

以後這些函式直接用,比賽的時候可以提高效率。也可以降低出錯的機率。

Uva 11400,照明系統設計

題意 有乙個照明系統需要用到n種燈,每種燈的電壓為v,電源費用k,每個燈泡費用為c,需要該燈的數量為l。注意到,電壓相同的燈泡只需要共享乙個對應的電源即可,還有電壓低的燈泡可以被電壓高的燈泡替代。為了節約成本,你將設計一種系統,使之最便宜。分析 每種電壓的燈泡要麼全換,要麼都不換,不然兩種電源都不要...

UVa11400 照明系統設計

題目描述 設計某個地方的照明系統 一共需要n種不同型別的燈泡 接著輸入每種燈泡的電壓v 對應電壓電源的 k 每個燈泡的 c 需要這種燈泡的數量l 電壓低的燈泡可以用電壓高的燈泡替換 每種燈泡只需要乙個對應的電源 求完成這個照明系統的最少花費。輸入有多組資料。輸出最小花費。樣例輸入 100 500 1...

UVA11400 分析推理 dp

有n種燈泡,不同種類的燈泡需要同種電源,同種燈泡只需乙個電源。你現在要設計乙個照明系統,給出n種燈泡的電壓v,電源費用k,乙個燈泡的費用c和所需該種燈泡數量l,電壓小的燈泡可以被電壓大的燈泡代替,求最小花費。由人類的直覺,我們應該把燈泡按照電壓從大到小排序,以方便處理。推理1 一種燈泡要麼全部替換為...