HDU 1051(模拟&贪心_F题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1051

-----------------------------------------------------------------------------------

题意:木材存在长宽,每次处理,只要长宽都大于之前的值,无需变化,否则需要调整,时间加一。问最小时间。

思路:首先按照长宽排序写一下,如果长度相等,按宽从小到大进行排序。然后,进行遍历,满足条件的排列标记出来。直到全部实现标记,即不存在未加工的木材。也就是说,每轮遍历都标记出一组可行的序列。进行的遍历次数就是所需时间。

代码:

#include<cstdio>
using namespace std;

int main(void){
    int T =0;
    scanf("%d",&T);
    for(int i=0;i<T;i++){
        int N =0;
        scanf("%d",&N);
        int a[N]={0};
        int b[N]={0};
        int flag[N]={0};
        for(int j=0;j<N;j++){
            scanf("%d",&a[j]);
            scanf("%d",&b[j]);
        }
        
        for(int k=0;k<N;k++){
            for(int j=k;j<N;j++){
                if(a[k]>a[j])
                {    
                    int tmp =a[k];
                    a[k]=a[j];
                    a[j]=tmp;
                    tmp =b[k];
                    b[k]=b[j];
                    b[j]=tmp;
                }else if(a[k]==a[j]&&b[k]>b[j]){
                    int tmp =a[k];
                    a[k]=a[j];
                    a[j]=tmp;
                    tmp =b[k];
                    b[k]=b[j];
                    b[j]=tmp;
                }
            }
        }
        int ss =a[0];
        int se =b[0];
        int ans =0;
        for(int m=0;m<N;m++)  
        {  
            if(!flag[m])  
            {  
                flag[m]=1;  
                ans++;  
                int weight =b[m];
                for(int j=m+1;j<N;j++)  
                {  
                    if(!flag[j]&& b[j]>=weight)  
                    {  
                        flag[j]= 1;  
                        weight = b[j];  
                    }  
                }  
            }  
        }
        printf("%d\n",ans);
    }

    return 0;

}
View Code

 

posted @ 2018-01-22 08:45  caomp  阅读(93)  评论(0)    收藏  举报