题目
心急的C小加
-
描述
-
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
样例输出
-
2 1 3
来源
- 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情况:
-
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。