二分貪心專題B
阿新 • • 發佈:2018-11-11
There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
InputThe input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.
OutputThe output should contain the minimum setup time in minutes, one per line.
Sample Input
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
InputThe input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.
OutputThe output should contain the minimum setup time in minutes, one per line.
Sample Input
3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1
Sample Output
2
1
3
題目大意:有一堆待加工的木棒,木棒有屬性長度L和質量W,我們對木棒加工有準備時間,規則如下:
1.第一根木棒花費準備時間1min
2.加工長度與質量均比上一根大的不需要準備時間,反之需要花費1min
要求求最小的準備時間。
按照題意分析,我們將L與W看做兩個數列,兩個數列遞增則不需要準備時間。即有幾個這樣雙遞增的數列就需要花費幾分鐘準備時間。
首先我們先找一個單遞增的數列(L或者W) 這裡我們以L為關鍵字進行排序。L相同的情況下按照W從小到大排序。
現在L已經是單調遞增數列。我們從頭遍歷,找有幾個單增的W數列(方法很簡單就是有一個變數記錄上一個木棒的W屬性,對於當前訪問的木棒i,若Wi<W,則是一個新的數列,否則continue)。新增標記陣列v,已加工的木棒標為true。
原始碼:
#include<iostream> #include<algorithm> using namespace std; struct mytype { int length; int weight; bool vis; }; int mycompare(mytype a,mytype b) { if (a.length==b.length) return a.weight<b.weight; return a.length<b.length; } int main() { int k; cin>>k; for (int o=1;o<=k;o++) { int n; mytype a[5010]; cin>>n; for (int i=1;i<=n;i++) a[i].vis=false; for (int i=1;i<=n;i++) cin>>a[i].length>>a[i].weight; sort(a+1,a+n+1,mycompare); int ans=0;int wei; for (int i=1;i<=n;i++) { if (a[i].vis) continue; if (!a[i].vis) { ans++; a[i].vis=true; wei=a[i].weight; } for (int j=i+1;j<=n;j++) { if (a[j].vis) continue; if (!a[j].vis&&a[j].weight<wei) continue; if (!a[j].vis&&a[j].weight>=wei) { a[j].vis=true; wei=a[j].weight; continue; } } } cout<<ans<<endl; } return 0; }