1065--Wooden Sticks解题报告

题目大意是只要后面的木棍长度和重量都不比前面小就不用花费准备时间。。。所以,只要使数组尽可能按要求排列即可,定义一结构体表示木棍的性质。

排序:按重量从小到大排列,若重量相等,则按长度从小到大排列。

递归:从第一个数开始,逐个进行搜索,若符合长度和重量都递增的条件的去掉,不符合的装入另一个结构体中,在对剩下的木棍进行搜索,一直到所得结构体为空为止。每一次递归,总数增加一,最后所得总数就是所求数;如:( 4 , 1 ) ,( 1 , 2 ) , ( 5 , 3 ) , ( 9 , 4 ) ,  (2 , 5 )  。第一次排除( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4),将( 1 , 2 ) , ( 2 , 5 )放入另一结构体,再对其进行搜索,第二次全部排除了,所以花费总时间为2秒。

代码:

#include
#include
using namespace std;
struct Node{
 int length;
 int weight;
}p[5000];
int sum;
bool cmp(Node a,Node b){
 if(a.weight!=b.weight)
       return a.weight  else
  returna.length }
void sub(Node p1[5000],int n){
 int i,b=p1[0].length;
 int k=0;
 Node q[5000];
 sum++;//每搜索一次花费时间加一;
 
   for(i=0;i   if(p1[i].length>=b)
   
   b=p1[i].length;//记录当前符合条件的长度的值,以便与后面的相比较
       
  else
   q[k++]=p1[i];//将不符合条件的装入结构体。
    }
 
 if(k>0)
       sub(q,k);//还没搜索完继续进行搜索。
 else
  printf("%d\n",sum);
}

int main(){
 int T,n,i;
 scanf("%d",&T);
 while(T--){
  scanf("%d",&n);
  for(i=0;i    scanf("%d%d",&p[i].length,&p[i].weight);
  sort(p,p+n,cmp);//排列
 
  sum=0;
  sub(p,n);//进行搜索;
    }
    return0;
}

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