杭电1051

/*题意是有n根木头,第一根木头加工处理要1分钟,当比第一根木头长度长重量大是加工处理不需要加时间,求最少的加工时间
1.定义一个wood的结构体,包括长度,重量和是否加工过。
2.定义数组的排序规则cmp按照从小到大的长度排当长度相同时,重量小的排在前面。
3.从长度最小的木头开始加工计数sum加一,并且把后面所有比这根木头长且重量大的木头都遍历了
4.最后的sum就是答案
*/

代码如下:
#include<iostream>
using namespace std;
#include<algorithm>
struct wood{//定义每根木棍的长度重量和是否遍历
 int length;
 int weight;
 int vis;
};
wood a[5005];
int cmp(wood a,wood b)//按木棍的长度的从小到大排序,当长度一致是把总重量偏小的排在前面
{
    if(a.length==b.length)
        return a.weight<b.weight;
    else
        return a.length<b.length;
}
int main()
{
    int n,t,sum;
    cin>>t;
    while(t--)
    {
        cin>>n;sum=0;
        for(int i=0;i<n;i++)
           {
               cin>>a[i].length>>a[i].weight;
        a[i].vis=0;
           }
           sort(a,a+n,cmp);
           for(int i=0;i<n;i++)
           {
               if(a[i].vis==0)//没有被处理过
               {//因为符合条件的木棍不会加时间,只需标记处理过就好
                   for(int j=i+1;j<n;j++)//找出第i根木棍的后面那些长度比它大的基础上重量也比它大的木棍,并且没有被处理过的
                   {
                       if(a[j].vis==0&&a[i].weight<=a[j].weight)
                       {
                           a[j].vis=-1;//因为符合条件的木棍不会加时间,只需标记处理过就好
                            a[i].weight=a[j].weight;//处理过更大的重量的木棍,要用更大的木棍来和小一个木棍来作比较
                       }
                   }
               sum++;
               }
           }
           cout<<sum<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/bai_guo/article/details/79751525