貪心思想:局部最優從而達到整體最優
題意:t組測試資料,每組n塊木頭,每塊木頭有相應的length和weight。現在對n塊木頭進行處理,setup time如下定義:
1、處理第一塊木頭setup time為1
2、如果後來處理木頭的length和weight分別都不小於前一塊的length和weight,則不需要setup time,否則setup time加一
求處理全部木頭的最小setup.
分析:
1、首先對木頭進行非降排序,每個木頭的結構為(l,w),以length為主要元素,weight為次元素。
(l1,w1)>(l2,w2)的條件是l1>l2 || (l1==l2 && w1>l2)
2、其次進行貪心選擇。初始計數器c=0, 每次從排序好的木頭前面選擇未使用過的木頭(l,w)做為當前木頭,然後標記已用,遍曆之後沒有用過的木頭(l1,w1),如果有(l1>=l&&w1>=w)則置(l1,w1)為已用並且替換當前木頭為(l1,w1)。每次遍曆之後計數器c加1,如果c等於總木頭數退出,否則跳到步驟2.
代碼:
#include <iostream><br />using namespace std;<br />const int N = 5000;<br />struct node{<br /> node& operator=(node &n){<br /> l=n.l, w=n.w, isUsed=n.isUsed;<br /> return *this;<br /> }<br /> bool operator>(node &n){<br /> return l>n.l || (l==n.l && w>n.w);<br /> }<br /> void swap(node &n){<br /> node tmp=*this;<br /> *this=n;<br /> n=tmp;<br /> }<br /> int l, w;<br /> bool isUsed;<br />}A[N];</p><p>int main()<br />{<br /> int t, n, i, j, k;</p><p> cin >> t;<br /> for(i=0;i<t;i++){<br /> //input<br /> cin >> n;<br /> for(j=0;j<n;j++){<br /> cin >> A[j].l >> A[j].w;<br /> A[j].isUsed=false;<br /> }<br /> //bubble sort<br /> for(j=1;j<n;j++)<br /> for(k=1;k<=n-j;k++)<br /> if(A[k-1] > A[k])<br /> A[k-1].swap(A[k]);<br /> //greedy<br /> node cur = A[0];<br /> A[0].isUsed=true;<br /> int c=0;<br /> while(true){<br /> for(j=1;j<n;j++) if(A[j].isUsed==false)<br /> if(A[j].l >= cur.l && A[j].w >= cur.w){<br /> A[j].isUsed=true;<br /> cur = A[j];<br /> }<br /> c++;<br /> for(j=1;j<n;j++) if(A[j].isUsed==false){<br /> cur = A[j];<br /> A[j].isUsed=true;<br /> break;<br /> }<br /> if(j==n) break;<br /> }<br /> cout << c << endl;<br /> }<br /> return 0;<br />}<br />