`
hellojyj
  • 浏览: 62434 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

HDU 1051 Wooden Sticks

    博客分类:
  • ACM
阅读更多

原题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1051

 

 

Wooden Sticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11290    Accepted Submission(s): 4642


Problem Description

 

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).
 

 

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 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.
 

 

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
 

 

Source

 

 

 

 

Recommend

 

We have carefully selected several similar problems for you:  1050 1052 1045 1053 1789
 
分析:这是一道明显的区间选择问题的贪心算法题,这里提供两种思路。
思路一:定义一个结构体
struct Stick{
   int  len; int wei; int flag }
用一个结构体数组Stick[MAXN],把所有木棍存入这个数组内,然后进行以wei降序排序,排完序后,然后循环扫描这个数组,每第一次扫描到未标记的(所有木棍初始化的时候都未标记),就把当前木棍的len取出来存入current中,然后遍历完整个数组,把扫描到未标记的木棍的len取出,如果小于current,那么就将它标记flag = 1;current  = 取出的len,这样就可以把所有能够在不重置时间的木棍在每一次遍历数组的时候选出来。当标记木棍数量达到所有木棍数量的时候就完成了,那么遍历数组的次数就是最小时间。
这样说太抽象了,我们以第一个测试数据为例(已经以wei排好序)
Array:(4,9)  (3,5)  (1,4)  (5,2)  (2,1)
step1:(4,9)  (3,5)  (1,4)  (5,2)  (2,1)
step2(4,9)  (3,5)  (1,4)  (5,2)  (2,1)
total step is 2;
思路二:同样定义一个结构体,不过不需要flag;
struct Stick{
   int  len; int wei; }
这里我们用优先队列和队列来存储所有木棍,首先把所有木棍存入以wei降序排序的优先队列中,然后把优先队列中的数据拷贝到普通队列中,把第一个数据pop()出来,current =  第一个木棍.len ;while(队列不等于空),我们每次都去取出队头元素,如果它的len<=current,那么current = 它的len ,如果不符合它的len<=current,把它重新压入队尾,等待第二次pop();也是每遍历一次队列所有元素,时间+1,那么怎么来控制和识别遍历过所有元素呢,可以用visit  来记录所访问过的stick,用left来记录你需要遍历的队列元素个数,用choose来记录你从队列彻底选择出来的stick数量,一直到队列为空。
Queue:(4,9)  (3,5)  (1,4)  (5,2)  (2,1)
step1:选出(4,9)  (3,5)  (1,4)  队列剩下: (5,2)  (2,1)
step2:选出  (5,2)  (2,1) 队列为空
//最少区间问题 贪心 HDU 1051
#include<cstdio>
#include<queue>
using namespace std;
struct Stick{
    int len;
    int wei;
    bool operator <(const Stick &rhs) const{
        return this->wei <= rhs.wei;
    }
};
priority_queue<Stick> qs;
queue<Stick> s;
int T,n,len,wei,count,visit,left,choose;
Stick curs,temp;
int main(){
    scanf("%d",&T);
    while(T--){
        choose = 0;
        visit = 0;
        count = 1;
        scanf("%d",&n);
        left = n;
        //让优先队列,以weight值降序排列结构体
        for(int i=0;i<n;i++){
            scanf("%d%d",&len,&wei);
            Stick st;
            st.len = len;
            st.wei = wei;
            qs.push(st);
        }
        //将优先队列的元素全部转移到普通队列中
        while(!qs.empty()){
          s.push(qs.top());
          qs.pop();
        }
        //取最大区间
        curs = s.front();
        s.pop();
        visit++;
        choose++;
        //一直到取完所有stick为止
        while(!s.empty()){
            //如果遍历过一次队列说明已经找所有不需要重新建立时间的stick
            if(visit == left){
                count++;
                left = left - choose;
                curs = s.front();
                s.pop();
                choose = 1;
                visit = 1;
            }
            //如果队列为空说明已经全部选出来了
            if(s.empty())
                break;
            temp = s.front();
            s.pop();
            visit++;

            //如何符合不用重新设置时间的,那么选出来
            if(curs.len >= temp.len ){
                curs = temp;
                choose++;
            }else{
                //否则继续推送到队列里等待下次选集
                s.push(temp);
            }
        }
        printf("%d\n",count);
    }
    return 0;
}
 
0
0
分享到:
评论

相关推荐

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    ACM HDU题目分类

    1051 经典贪心,也可以用 DP;1058 经典问题,丑数,DP;1081 经典 DP 等等。 搜索题 搜索题是 ACM HDU 题目分类中的一大类,例如,1010 搜索题,剪枝很关键;1016 经典的搜索;1026 搜索;1043 经典搜索题,八...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU1059的代码

    HDU1059的代码

    hdu1001解题报告

    hdu1001解题报告

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    hdu2101解决方案

    hdu2101AC代码

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

    hdu 5007 Post Robot

    hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。

    Hdu1000—2169部分代码

    HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...

    HDU acm-PPT课件

    【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...

    HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu.

    【标题】"HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu." 暗示这是一个与HDU(杭州电子科技大学在线编程平台)相关的压缩包,其中可能包含了该平台上的编程竞赛题目或练习题目的源代码。"hdu07"可能是某个特定题目的...

    hdu acm1166线段树

    hdu 1166线段树代码

    HDU最全ac代码

    HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

Global site tag (gtag.js) - Google Analytics