贪心算法,即每一次执行后的结果最大活着最小。
题意分析:给出n根木棍包括长度和重量,然后求出制作这些木棍的最短时间,可在前一个木棍的基础上制作下一个木棍。建立一个木棍的时间是一分钟,如果接下来木棍的长度和重量都大于上一个木棍,可以不用建立,直接使用,即不花费的时间,如果不符合要求,则需要重新建立木棍,直到所有木棍建立完毕。输出建立木棍的最小时间。
输入:多组数据T,每一组有N个木棍,接下来输入每根木棍的长度和重量
输出:所有木棍搭建完成后,最小的建立时间
思路分析:对所有木棍的长度和重量进行排序,以长度为第一要素,重量为第二要素,从小到大排序。排序后进行多次扫描,看在一次的建立时间内可以完成几个木棍,并把可以完成的木棍的标志变量map[i]设为1,表明该木棍完成,不需要下次扫描,直到所有木棍标记完成
样例分析:
5
4 9 5 2 2 1 3 5 1 4
代码解释C/C++:
#include <iostream>
#include <algorithm>
using namespace std;
struct Node //定义结构体,包括变量l,k,代表木棍的长度和重量
{
int l, w;
}a[5001]; //定义结构体数组
int cmp(Node x, Node y) //定义函数cmp用来比较木棍长度和重量,从小到大排序
{
if(x.l<y.l)
return 1;
else if(x.l>y.l)
return 0;
else
return x.w<y.w;
}
int main()
{
int t,n,i,j,sum,m;
int map[5001]; //定义标志变量数组,用来标记木棍是否完成
cin>>t; //输入T组测试数据
while(t--)
{
cin>>n;
for(i=0;i<n;i++) //输入每个木棍的长度和重量
cin>>a[i].l>>a[i].w;
sort(a,a+n,cmp); //按长度为第一要素,重量第二要素进行排序
memset(map,0,sizeof(map));
sum=0;
m=0;
while(sum!=n) //判断所有木棍是否都被完成,如果否则继续进行
{
for(i=0;i<n;i++)
{
if(map[i]==0) //判断该木棍是否已经存在,map[i]==0表示不存在
{
j=i; //从该木棍开始建立
m++; //时间变量+1
break;
}
}
for(i=0;i<n;i++)
{
if(map[i]==0&&a[i].l>=a[j].l&&a[i].w>=a[j].w) //如果该木棍符合要求,则标志变量置为1,表示完成,总体数量+1,并进行下一次比较
{
map[i]=1;
sum++;
j=i;
}
}
}
cout<<m<<endl;
}
return 0;
}