通過這個題目我以為我了發現資料結構課本快排**的乙個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 一種燈泡要麼全部替換為...