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<stdio.h>
#include<algorithm>
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<b.weight;
 else
  returna.length<b.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<n;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<n;i++)
   scanf("%d%d",&p[i].length,&p[i].weight);
  sort(p,p+n,cmp);//排列
 
  sum=0;
  sub(p,n);//进行搜索;
    }
    return0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值