zoukankan      html  css  js  c++  java
  • 1270: Wooden Sticks [贪心]

    点击打开链接


    1270: Wooden Sticks [贪心]

    时间限制: 1 Sec 内存限制: 128 MB

    提交: 31 解决: 11 统计

    题目描述

    Lialosiu要制作木棍,给n根作为原料的木棍的长度和重量。根据要求求出制作木棍的最短时间。

    首先我们知道制作第一个木棍需要1分钟,若是接着要制作的木棍的重量和长度都不少于当前的木棍,那么就不需要建立的时间,若是没有,则再需要建立时间,也就是1分钟。

    举个例子,如果你有五个原料木棍,他们的长度和重量分别是(4,9), (5,2), (2,1), (3,5), 和 (1,4), 那么第一分钟你要建立一根木棍作为起始参照,比如(1,4)接下来(3,5)和(4,9)都可以不花费时间,然后用第二分钟选取(2,1)这跟木棍作为参照,接下来(5,2)可以不花费任何时间,总的来说,你一共花费了两分钟,这也是你可能使用的最少时间。

    现在给了n个木棍的长度和重量,你能求出使用这些木棍的最少时间吗?

    输入

    首先,输入一个正整数T ,代表有T组数据。

    接下来,第二行你要输入正整数n(1<=n<=5000)代表的你的原料木棍个数。

    第三行你要输入2*n 个 正整数l1, w1, l2, w2, ..., ln, wn,每一个数字都不超过10000 。 li代表第i根木棍的长度,wi代表第i根木棍的重量。

    输出

    输出一个整数,代表最少需要的时间t。

    样例输入

    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
    

    样例输出

    2
    1
    3
    

    来源


    代码实现:(AC代码)

    [cpp] view plain copy
    1. #include <iostream>  
    2. #include <string.h>  
    3. #include <algorithm>  
    4. using namespace std;  
    5. struct w  
    6. {  
    7.     int l,w;  
    8.     bool ok;//用来标记是否木头被处理掉。  
    9. }wood[5003];  
    10. bool cmp(w a,w b)//首先按长度从大到下排序,长度相同的按重量从大到小排序  
    11. {  
    12.     if(a.l>b.l)  
    13.         return true;  
    14.     else if(a.l==b.l)  
    15.     {  
    16.         if(a.w>b.w)  
    17.             return true;  
    18.         return false;  
    19.     }  
    20.     return false;  
    21. }  
    22. int main()  
    23. {  
    24.     int t;cin>>t;  
    25.     while(t--)  
    26.     {  
    27.         int n;cin>>n;  
    28.         for(int i=1;i<=n;i++)  
    29.             {  
    30.                 cin>>wood[i].l>>wood[i].w;  
    31.                 wood[i].ok=0;//初始化木头都未处理。  
    32.             }  
    33.         sort(wood+1,wood+1+n,cmp);//排序。  
    34.         int setup=0;int emp=0;//已经被处理的木头的个数  
    35.         w temp;  
    36.         while(1)  
    37.         {  
    38.             if(emp==n)//当所有的木头都被处理时,结束循环  
    39.                 break;  
    40.             for(int i=1;i<=n;i++)//寻找每次机器启动,处理的那根长度最长,重量最重的那根木头。实质,多次寻找最长递减子序列,及寻找最大的那个元素  
    41.             {  
    42.                 if(!wood[i].ok)  
    43.                     {  
    44.                         temp=wood[i];  
    45.                          break;//别忘了这一句  
    46.                     }  
    47.             }  
    48.            // cout<<"**"<<temp.l<<" "<<temp.w<<endl;  
    49.             for(int i=1;i<=n;i++)  
    50.             {  
    51.                 if(!wood[i].ok&&wood[i].l<=temp.l&&wood[i].w<=temp.w)//前提是该木头没有被处理,所以必须加上!wood[i].ok  
    52.                 {  
    53.                     wood[i].ok=1;//该木头被处理  
    54.                     emp++;  
    55.                     temp=wood[i];//及时更换长度最长,重量最重的那根木头,及递减子序列的当前元素的下一个元素。  
    56.                 }  
    57.             }  
    58.             setup++;//一次启动处理结束。  
    59.         }  
    60.         cout<<setup<<endl;  
    61.     }  
    62.     return 0;  
    63. }  

    1. #include<iostream>  
    2. #include<algorithm>  
    3. #include<cstring>  
    4.   
    5. using namespace std;  
    6. struct node{  
    7.     int l,w;  
    8. }p[10005];  
    9.   
    10. int cmp(node a,node b)  
    11. {  
    12.     if(a.l==b.l)  
    13.     return a.w<b.w;  
    14.       
    15.     return a.l<b.l;  
    16. }  
    17.   
    18. int main()  
    19. {  
    20.     int t,n,i,j,k,v[10005],flag;  
    21.     cin>>t;  
    22.     while(t--)  
    23.     {  
    24.         long long sum=0;  
    25.         cin>>n;  
    26.         for(i=0;i<n;i++)  
    27.         cin>>p[i].l>>p[i].w;  
    28.           
    29.         memset(v,0,sizeof(v));  
    30.         sort(p,p+n,cmp);  
    31.         v[0]=1;k=0;  
    32.           
    33.         while(k<n)  
    34.         {  
    35.             ++sum;  
    36.             for(i=k+1,j=k,flag=1;i<n;++i)  
    37.             {  
    38.                 if(v[i])  
    39.                 continue;  
    40.                   
    41.                 if((p[j].w<=p[i].w)&&(p[j].l<=p[i].l))  
    42.                 {  
    43.                     v[i]=1;  
    44.                     j=i;  
    45.                 }  
    46.                 else  
    47.                 {  
    48.                     if(flag)  
    49.                     {  
    50.                         flag=0;  
    51.                         k=i;  
    52.                     }  
    53.                 }  
    54.             }  
    55.             if(flag)  
    56.             break;  
    57.         }  
    58.         cout<<sum<<endl;  
    59.     }  
    60.     return 0;  
    61. }  


    刚开始想的是把长度和重量合成一个整数,然后进行排序,然后再把那个数%10,求出个位数字,但是这样想的话只是把重量当成个位数来处理,可以。如果是十位数字以上就不行了



    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7406499.html
Copyright © 2011-2022 走看看