poj1065(木棍加工贪心)

【题意】

有n根木棒,已知他们的质量和长度,需对他们进行加工,开机1分钟,加工一根一分钟,

且每次开机后,加工的第i+1根必须比第i根的长度和质量都要大才行,问最短加工时间。

【输入】

第一行T表示T组数据。

每组数据第一行一个N,表示几根木棒。

然后N个二元组,表示每根木棒的长度与质量。

【输出】

对于每组数据,输出最短加工时间。

思路:

按照长度小到大排序,长度相等则按照重量小到大排序,先找第一次能加工的序列,然后以这个为标准继续找,直到找不到,这就是第一次加工

继续这样直到全部加工

#include
#include
#include
using namespace std;
struct wood
{
    int len;
    int wight;
    int flag ;
}w[10005];
bool cmp(wood a,wood b)
{
    if(a.len == b.len)
        return a.wight < b.wight;
    else
        return a.len < b.len;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int m;
        scanf("%d",&m);
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d",&w[i].len,&w[i].wight);
            w[i].flag = 0;
        }
        sort(w,w+m,cmp);
        int sum = 0,count = 0;
        for(int i = 0; i < m; i++)
        {
            if(w[i].flag == 0)
            {
                int k = i;
                sum++;w[i].flag = 1;//加工过的做标记
                for(int j = i+1;j < m ; j++)
                {
                    if(!w[j].flag &&w[k].wight <= w[j].wight)//找能加工的并且没有用过的加工
                    {
                        k = j;//
                        w[j].flag = 1;
                    }
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}


你可能感兴趣的:(poj,贪心算法)