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)
  • 相关阅读:
    mysql 单表下的字段操作_查询
    mysql 表的操作
    mysql 单表下的字段操作
    mysql库的操作
    vim 复制&粘贴
    将系统剪贴板的内容粘贴到vim
    nc替代ping
    kali 将家目录下的中文文件名修改成英文
    Shiro反序列化漏洞检测、dnslog
    mac命令行切换python版本
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7406499.html
Copyright © 2011-2022 走看看