心急的小C加

来源:互联网 发布:2016年网络大电影数据 编辑:程序博客网 时间:2024/05/21 17:36

题目

心急的C小加

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

输入
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
输出
处理这些木棒的最短时间。
样例输入
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 
样例输出
213
来源
POJ改编
上传者

陈玉


心得:将木棒按长度排序,如果相同,按重量排序;依次往后遍历,长度和重量都大于前一根木棒的木棒放一起,依次处理。主要问题是排序的过程中,如果用选择法之类的会超时,所以用到c/c++中的sort()函数,此处序自定义。


代码<c/c++>:


#include<stdio.h>
#include<string.h>//memset(a,0,sizeof(a));头文件
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 10001


//结构体,包含长度和重量
   int L;
struct Stick{
   int L;
   int W;
}a[MAXSIZE];


//自定义的比较函数

bool cmp(Stick x,Stick y){
if(x.L!=y.L) return x.L<y.L;
return x.W<y.W;
}


//主函数
int main()
{
    int T,N,L,W,i=0,j,counter=0,t;
    scanf("%d",&T);
    while(T--){
             memset(a,0,sizeof(a)); //首先需要将数组清零
            scanf("%d",&N);
     //输入木棒信息
           for(i=0;i<N;i++){
                scanf("%d%d",&a[i].L,&a[i].W);
           }
    //排序
           sort(a,a+N,cmp);
    //计算时间
           for(i=0;i<N;i++){
                if(a[i].W!=0){//去掉已经处理过的木棒
                 t=a[i].W;
                 counter++;//刚使用机器的时候消耗一个单位时间,每轮消耗一个单位时间
                 for(j=i+1;j<N;j++){
                 if(a[j].W>=t){//下一个的长度一定比前一根木棒长,现要求重量也比前一个重的木棒
                 t=a[j].W;//最新处理掉的用来与后一根比较
                 a[j].W=0;//将已经处理过的用0标记,不再处理
                }
            }
       }
     }
       cout<<counter<<endl;
      counter=0;//初始化

  }
    return 0;
}



AC情况:


原创粉丝点击