Wooden Sticks

来源:互联网 发布:修罗场是什么意思网络 编辑:程序博客网 时间:2024/05/18 12:04

题目链接:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=1&sectionid=3&problemid=16

方法:贪心算法,多参数排序

思路:木棒拥有两个参数,因此需要用结构体变量来表示木棒,并对木棒按照长度进行排序,若长度相同,则按照重量排序。排序完成后,需要对其进行扫描,每次扫描找出最长的不减序列。

难点:扫描最长不减序列,注意这里凡是未经标记的木棒并不是没有使用的木棒,而是以此木棒开始产生的一个不减序列,因此统计没有标记的木棒数目就是有几个这样的序列,也就是所需要开机的次数,即答案。

#include<cstdio>#include<algorithm>#define N 5010using 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);        }    }}


0 0
原创粉丝点击