UVALive 2322. Wooden Sticks 贪心 结构体排序

2322 - Wooden Sticks

Time limit: 1.000 seconds
There is a pile of  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:
  • The setup time for the first wooden stick is 1 minute.
  • Right after processing a stick of length and weight , the machine will need no setup time for a stick of length l' and weight w' if <=l' and <=w' .Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of  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).

Input 

The 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 2 positive integers  l1w1l2w2, ...,  lnwn, each of magnitude at most 10000, where  li and  wi are the length and weight of the  th wooden stick, respectively. The 2 integers are delimited by one or more spaces.

Output 

The 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
来源: <https://icpcarchive.ecs.baylor.edu/external/23/2322.html>
 
          这是个贪心算法入门题,题目大意是给定$n$根木棍,以及每根木棍的长度$l$和重量$w$。现在要对它们进行加工,机器调整时间为1分钟,如果加工完一根长$l$重$w$的木棍后,下一根长$l'$重$w'$的木棍满足$l\leq l'$且$w\leq w'$,那么机器就可以继续加工而不需要进入调整时间。否则的话,又需要1分钟的调整时间才能继续加工。求总共最小需要的调整时间。
          如果要求总共最小的时间,那么就要尽量把木棍分成几个序列,使得每个序列中前一个根木棍和后一根木棍的$l$和$w$都相差很小,但又能满足 $l\leq l'$且$w\leq w'$。瞬间想到应该用排序来做,但排序分主次,很遗憾我们并不能同时对两个主元进行排序,必须先对$l$排序,然后对$w$贪心,或者对$w$排序对$l$贪心。
          基本思路是比如我对$l$排序,这样整个序列就是满足 $l\leq l'$的辣,然后遍历这个序列,如果还满足 $w\leq w'$那么太好了,把这个木棍的下标记下来,去找下一个满足条件的木棍,这样找下去就找到第一个子序列辣。再去找剩下的,发现我们不知道哪些是找过的,好,给木棍加一个vis状态,0为未访问1为访问过哒,OK那么每次找子序列呢先找到一个未访问过的木棍,把res加一,然后对于这个序列我贪心的去找下一根木棍并把它的vis记为1。全部木棍被标为1的时候也就找完辣!
 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 struct st {
 5     int l, w, vis;
 6     bool operator<(const st&c)const {
 7         return l==c.l?w<c.w:l<c.l;
 8     }
 9 }stick[5001];
10 
11 int n;
12 void read() {
13     scanf("%d", &n);
14     for(int i=0; i<n; i++) {
15         scanf("%d%d", &stick[i].l, &stick[i].w);
16         stick[i].vis = 0;
17     }
18 }
19 
20 void find(int i) {
21     int k = i;
22     for(int j=i+1; j<n; j++)
23         if(!stick[j].vis)
24             if(stick[k].w<=stick[j].w) {
25                 stick[j].vis = 1;
26                 k=j;
27             }
28 }
29 
30 void work() {
31     int res = 0;
32     std::sort(stick, stick+n);
33     for(int i=0; i<n; i++) {
34         if(!stick[i].vis) {
35             stick[i].vis = 1;
36             ++res;
37             find(i);
38         }
39     }
40     printf("%d\n", res);
41 }
42 
43 int main() {
44     int T, n;
45     scanf("%d", &T);
46     while(T--) {
47         read();
48         work();
49     }
50     return 0;
51 }

 

 

By Black Storm(使用为知笔记)

你可能感兴趣的:(UVALive 2322. Wooden Sticks 贪心 结构体排序)