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; }

浙公网安备 33010602011771号