zoukankan      html  css  js  c++  java
  • 小木棍 [数据加强版]*

    题目描述

    乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。

    现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

    给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

    输入输出格式

    输入格式:

    输入文件共有二行。

    第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65

    (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)

    第二行为N个用空个隔开的正整数,表示N根小木棍的长度。

    输出格式:

    输出文件仅一行,表示要求的原始木棍的最小可能长度

    输入输出样例

    输入样例#1:
    9
    5 2 1 5 2 1 5 2 1
    
    输出样例#1:
    6
    思路:dfs+剪枝
    代码实现:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,ans;
     6 int s[80];
     7 int a[80],b,c;
     8 inline int max_(int x,int y){return x>y?x:y;}
     9 inline bool cmp(int a,int b){return a>b;}
    10 bool dfs(int k){
    11     memset(a,0,sizeof(a));
    12     for(int i=1;i<=n;i++){
    13         b=0;
    14         while(a[b]+s[i]>k) b++;
    15         a[b]+=s[i];
    16     }
    17     for(int i=0;a[i];i++)
    18     if(a[i]<k) return 0;
    19     return 1;
    20 }
    21 int main(){
    22     scanf("%d",&n);
    23     for(int i=1;i<=n;i++){
    24         scanf("%d",&s[i]);
    25         if(s[i]>50) i--,n--;
    26         else ans=max_(ans,s[i]);
    27     }
    28     sort(s+1,s+n+1,cmp);
    29     while(!dfs(++ans));
    30     printf("%d",ans);
    31     return 0;
    32 }
    贪心 得分:47 耗时:34ms 内存:16414kb 代码:0.59KB

     然而正解的搜索并没有打出来。

    题目来源:洛谷

  • 相关阅读:
    【MySQL】:利用DCL管理用户和控制权限
    【MySQL】:事务四大特性与隔离级别
    JDBC概述及编程步骤详解
    【MySQL】:多表查询
    【MySQL】:MySQL中四大约束
    MySQL解决DOS窗口乱码问题
    【MySQL】:分组查询where和having
    【MySQL】:利用DQL查询表中的数据
    【MySQL】:利用DML操作表中数据
    【MySQL】:利用DDL操作数据库、表
  • 原文地址:https://www.cnblogs.com/J-william/p/6644337.html
Copyright © 2011-2022 走看看