题目链接:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=3&problemid=16
方法:贪心算法,多参数排序
思路:木棒拥有两个参数,因此需要用结构体变量来表示木棒,并对木棒按照长度进行排序,若长度相同,则按照重量排序。排序完成后,需要对其进行扫描,每次扫描找出最长的不减序列。
难点:扫描最长不减序列,注意这里凡是未经标记的木棒并不是没有使用的木棒,而是以此木棒开始产生的一个不减序列,因此统计没有标记的木棒数目就是有几个这样的序列,也就是所需要开机的次数,即答案。
#include<cstdio>
#include<algorithm>
#define N 5010
using namespace std;
struct stick
{
int length;
int weight;
}s[N];
bool cmp(stick a,stick b)
{
if (a.length==b.length)
return a.weight<b.weight;
return a.length<b.length;
}
int main()
{
int t,n;
int i,j;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d",&n);
for (i = 0;i < n;i++)
{
scanf("%d%d",&s[i].length,&s[i].weight);
}
sort(s,s+n,cmp);
int mark[N] = {0};
for (i = 0;i < n;i++)
{
int id = i;
for(j = i+1;j < n;j++)
{
if(mark[i]) continue;
if(s[j].length>=s[id].length&&s[j].weight>=s[id].weight&&!mark[j])
{
mark[j] = 1;
id = j;
}
}
}
int num = 0;
for(i = 0;i < n;i++)
{
if(mark[i]!=1)
num++;
}
printf("%d\n",num);
}
}
}