hdu 1051 Wooden Sticks
2013-02-06 10:33
281 查看
对木棍的长度和重量进行排序,以长度为首要考虑。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。于是,我们对排序后的数组进行多次扫描,将可以在一次建立时间内完成的进行标记,设置一个外部变量number来计数已扫描的元素的数量。
例子:
5
4 9 5 2 2 1 3 5 1 4
排序完后:
1 4 2 1 3 5 4 9 5 2
然后进行第一次扫描:使用mark[]数组进行标记,mark[]初始化为0,红色为第一次描过的。
Stiks: (1 4) (2 1)
(3 5) (4 9) (5 2)
Mark: 1 0 1
1 0
这时的setuptime为建立第一套木棍所要的时间,即1,此时已扫描元素数number为3
接着进行第二次扫描,蓝色为第二次扫描过的结果。
Stiks: (1 4) (2 1)
(3 5) (4 9) (5 2)
Mark: 1
1
1 1
1
这时的setuptime为建立第二套木棍所要的时间,即2,此时已扫描元素数number为5
AC代码:
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define NUM 5005
struct sticks
{
int length;
int weight;
}stick[NUM];
int cmp(const void *a, const void *b)
{
struct sticks *x=(struct sticks*)a;
struct sticks *y=(struct sticks*)b;
if(x->length==y->length)
return x->weight - y->weight;
return x->length - y->length;
}
bool comp(sticks a, sticks b)
{
if(a.length == b.length)
return a.weight < b.weight;
return a.length < b.length;
}
int main()
{
int cases,n,i,res,number,mark[NUM];
cin>>cases;
while(cases--){
cin>>n;
for(i=0;i<n;++i)
cin>>stick[i].length>>stick[i].weight;
sort(stick,stick+n,comp);
number=0;res=0;
int index;//满足递增条件的上一个元素
//qsort(stick,n,sizeof(stick[0]),cmp);
memset(mark,0,sizeof(mark));
while(number!=n){
//qsort(stick+index-1,n-index+1,sizeof(stick[0]),cmp);
for(i=0;i<n;i++){
if(!mark[i])//找到未遍历的第一个,设为index
{
index=i;
res++;
break;
}
}
for(i=0;i<n;i++){//此次遍历将找出满足递增条件的元素,进行mark
if(!mark[i]&&stick[index].length<=stick[i].length&&stick[index].weight<=stick[i].weight){
mark[i]=1;
number++;
index=i;
}
}
}
cout<<res<<endl;
}
return 0;
}
例子:
5
4 9 5 2 2 1 3 5 1 4
排序完后:
1 4 2 1 3 5 4 9 5 2
然后进行第一次扫描:使用mark[]数组进行标记,mark[]初始化为0,红色为第一次描过的。
Stiks: (1 4) (2 1)
(3 5) (4 9) (5 2)
Mark: 1 0 1
1 0
这时的setuptime为建立第一套木棍所要的时间,即1,此时已扫描元素数number为3
接着进行第二次扫描,蓝色为第二次扫描过的结果。
Stiks: (1 4) (2 1)
(3 5) (4 9) (5 2)
Mark: 1
1
1 1
1
这时的setuptime为建立第二套木棍所要的时间,即2,此时已扫描元素数number为5
AC代码:
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define NUM 5005
struct sticks
{
int length;
int weight;
}stick[NUM];
int cmp(const void *a, const void *b)
{
struct sticks *x=(struct sticks*)a;
struct sticks *y=(struct sticks*)b;
if(x->length==y->length)
return x->weight - y->weight;
return x->length - y->length;
}
bool comp(sticks a, sticks b)
{
if(a.length == b.length)
return a.weight < b.weight;
return a.length < b.length;
}
int main()
{
int cases,n,i,res,number,mark[NUM];
cin>>cases;
while(cases--){
cin>>n;
for(i=0;i<n;++i)
cin>>stick[i].length>>stick[i].weight;
sort(stick,stick+n,comp);
number=0;res=0;
int index;//满足递增条件的上一个元素
//qsort(stick,n,sizeof(stick[0]),cmp);
memset(mark,0,sizeof(mark));
while(number!=n){
//qsort(stick+index-1,n-index+1,sizeof(stick[0]),cmp);
for(i=0;i<n;i++){
if(!mark[i])//找到未遍历的第一个,设为index
{
index=i;
res++;
break;
}
}
for(i=0;i<n;i++){//此次遍历将找出满足递增条件的元素,进行mark
if(!mark[i]&&stick[index].length<=stick[i].length&&stick[index].weight<=stick[i].weight){
mark[i]=1;
number++;
index=i;
}
}
}
cout<<res<<endl;
}
return 0;
}
相关文章推荐
- hdu 1051 Wooden Sticks(贪心)
- POJ 1065 && HDU 1051 Wooden Sticks(贪心)
- HDU 1051 Wooden Sticks 贪心
- HDU 1051 Wooden Sticks(加工木块,LIS,dp)
- hdu 1051:Wooden Sticks(水题,贪心)
- HDU 1051 Wooden Sticks(贪心)
- hdu 1051 Wooden Sticks(贪心)
- HDU 1051 Wooden Sticks (贪心)
- HDU 1051 Wooden Sticks 贪心
- HDU 1051 Wooden Sticks(贪心算法)
- hdu1051 Wooden Sticks (贪心)
- HDU_1051_WoodenSticks
- HDU 1051: Wooden Sticks(贪心)
- hdu——1051——Wooden Sticks
- HDU 1051 Wooden Sticks【LIS】
- HDU 1051 Wooden Sticks (简单贪心)
- hdu1051——Wooden Sticks
- HDU:1051 Wooden Sticks(贪心+动态规划DP||LIS?)
- HDU 1051 Wooden Sticks (贪心,嵌套区间个数 )
- hdu 1051 Wooden Sticks