HDU 1051

贪心算法,即每一次执行后的结果最大活着最小。

题意分析:给出n根木棍包括长度和重量,然后求出制作这些木棍的最短时间,可在前一个木棍的基础上制作下一个木棍。建立一个木棍的时间是一分钟,如果接下来木棍的长度和重量都大于上一个木棍,可以不用建立,直接使用,即不花费的时间,如果不符合要求,则需要重新建立木棍,直到所有木棍建立完毕。输出建立木棍的最小时间。

输入:多组数据T,每一组有N个木棍,接下来输入每根木棍的长度和重量

输出:所有木棍搭建完成后,最小的建立时间

思路分析:对所有木棍的长度和重量进行排序,以长度为第一要素,重量为第二要素,从小到大排序。排序后进行多次扫描,看在一次的建立时间内可以完成几个木棍,并把可以完成的木棍的标志变量map[i]设为1,表明该木棍完成,不需要下次扫描,直到所有木棍标记完成

样例分析:

5

4 9 5 2 2 1 3 5 1 4 

排序后:1 4 2 1 3 5 4 9 5 2
第一次建立: 1 4 2 1 3 5 4 9 5 2 (红色为可以完成的木棍)
map[i] 1 0 1 1 0
时间为1 minuses, 标记变量计数为3
第二次建立: 1 4 2 1 3 5 4 9 5 2
map[i] 1 1 1 1 1
时间为2 minuses, 标记变量计数为5, 所有木棍完成,输出时间

代码解释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;
}

posted @ 2018-05-13 17:05  MCQ  阅读(181)  评论(0编辑  收藏  举报