贪心算法1001

简单题意:给定若干木棒,有长度和宽度,第一根木棒加工需要一分钟,如果第二根木棒的长度和宽度都大于或者等于第一根木棒,则不需要消耗另外的时间,以此类推;

解题思路:

首先对木棒进行排序,按照长度从小到大排序,如果长度相同,则按照重量排序,从第一根开始,以此与下一根木棒的重量比较,定义变量min=0;如果符合条件,min++;由于存在重复比较的问题,在数组里定义两个判断变量来判断该木棒是否已经进行比较过。最后比较完成,n-min=所需时间;

ac代码:

#include <iostream>
#include <algorithm>
struct mm
{
    int l;
    int w;
    int x;
    int v;
}a[5001];
int cmp( mm a,mm b)
{
    if(a.l==b.l)
    return a.w<b.w;
     if(a.l<b.l)
    return true;
    return false;
}
using namespace std;
int main()
{
    int n,N,i,j,min=0,y;
    cin>>N;
    while(N-->0)
    {
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>a[i].l>>a[i].w;
            a[i].x=0;
            a[i].v=0;
        }int m=0;
        sort(a,a+n,cmp);
        for(i=0;i<n;m++)
       {i=m;
            for(j=i+1;j<n;)
            {
                if(a[i].w>a[j].w||a[j].x==1)
                {
                    j++;
                    continue;
                }
                 if(a[i].w<=a[j].w&&a[j].x!=1)
                {
                    if(a[i].x==1)
                    {j++;
                    continue;
                    }
                    min++;
                    i=j;
                    a[j].v=1;j=i+1;
                    continue;
                }

            }
            for( y=0;y<n;y++)
            a[y].x=a[y].v;


       }
       cout<<n-min<<endl;
       min=0;
    }

    return 0;
}

感想:当有多次重复比较是,可以设置相关变量来判断是否符合比较条件;

posted @ 2016-03-19 11:16  Si考者  阅读(286)  评论(0编辑  收藏  举报