简单题意:锯木头,第一块木头的设定时间是1分钟,如果第二块木头的长和宽都不小于第一块的长和宽,不用重新设置,否则重新设置,计时器加1
解题思路:模拟题目过程,先按长度升序排列,初始化bool数组为0,根据题目条件进行比较,bool数组通过下标与每个元素进行联系,并记录每个数据是否符合条件,符合条件为1,不符合为0,直到bool数组全为1时结束循环。
感想:贪心算法想不出怎么表达= =
AC代码:
#include<iostream>
#include<fstream>#include<algorithm>
using namespace std;
struct Wood{
int l,w;
int id;
};
bool cmp(const Wood &a,const Wood &b)
{
if(a.l<=b.l) return true ;
else return false;
}
int main()
{
//ifstream cin("b.txt");
Wood w[5001];
Wood w1[5001];
bool b[5001];
int n,i,j,k,flag,pre;
cin>>n;
while(cin>>n)
{
k=0;
for(i=0;i<n;i++)
{
cin>>w[i].l>>w[i].w;
b[i]=0;
}
sort(w,w+n,cmp);
for(i=0;i<n;i++)
w[i].id=i;
flag = 1;
while(flag==1)
{
k++;
j=0;
flag=0;
for(i=0;i<n;i++)
{
if(b[i]==0) {
w1[j].l=w[i].l;
w1[j].w=w[i].w;
w1[j].id=w[i].id ;
j++;
}
}
/*for(i=0;i<j;i++)
cout<<w1[i].l << " " << w1[i].w << " " << w1[i].id <<endl;
cout << endl;*/
b[w1[0].id]=1;
pre=0;
for(i=1;i<j;i++)
{
if(w1[pre].l<=w1[i].l&&w1[pre].w<=w1[i].w){
b[w1[i].id]=1;
pre=i;
}
}
//for(i=0;i<n;i++)
//cout << b[i] ;
//cout << endl;
for(i=0;i<n;i++)
{
if(b[i]==0) {
flag=1;
break;
}
}
}
cout<<k<<endl;
}
return 0;
}