POJ 1011 Sticks解題報告

来源:https://www.cnblogs.com/cpera/archive/2018/08/14/9478663.html
-Advertisement-
Play Games

Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to ...


Description

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.

Input

The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.

Output

The output should contains the smallest possible length of original sticks, one per line.

Sample Input

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

Sample Output

6
5
題意:將一組等長木棒隨機截斷,知道截斷後所有木棒長度,求截斷前等長木棒最小長度
思路:從小到大枚舉原長(從長度最長的木棍開始),DFS+剪枝
先求和,用總和除以原長得到需要拼湊的木棍數量,進行dfs判斷可行性
剪枝1:從長到短排序木棍,以便於優先用少量長木棍達到目標,減少dfs次數
剪枝2:當拼湊一根等長木棍時,當前沒用過的最長的木棍一定會成為第一個(因為每次的拼湊策略總會選擇比上一個選擇木棍短的棍子,如果沒有選當前最長,說明當前最長一定不能當一組方案中的次長木棍)
剪枝3:每一次只考慮比上一次選擇更短的木棍,因為比上一次選擇更長的木棍已經考慮過。
剪枝4:當一次拼湊有多個相同長度木棍可選時,只選擇其中的一個進行搜索,以避免重覆搜索
剪枝5:沒有必要用完所有的小棒拼出完整的m根等長木棒,只需要拼出m-1根,因為剩下的小棒無論如何是可以拼成的
(剪枝6:如果當前已拼湊的長度加上所有輸入數據的最小值還是大於要求的等長木棒長度,直接返回不可能。)
代碼(吐槽一下大多數16ms題解沒優化完全)(0ms通過)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#include<queue>
#include<vector>
#include<numeric>
using namespace std;
#define f(i,j) for(int i=1;i<=j;i++)
#define fx(i,k,j) for(int i=k;i<=j;i++)
#define gi(i) scanf("%d",&i)
#define gii(i,j) scanf("%d%d",&i,&j)
#define gi(i) scanf("%d",&i)
#define giii(i,j,k) scanf("%d%d%d",&i,&j,&k)
#define pi(i) printf("%d\n",i)
#define pii(i,j) printf("%d %d\n",i,j)
#define pf printf
#define inf 0x3f3f3f3f
#define clr(a) memset(a,0,sizeof(a))
#define fill(a,b) memset(a,b,sizeof(a))
#define _inline __attribute__((always_inline)) inline
typedef long long LL;
int n;
int vis[65];
int p[65];
int L;
int ndl;
int dfs(int tot,int stk,int sta){
    if(stk==ndl) return 1;
    if(tot==L) return dfs(0,stk+1,0);
    if(tot==0) sta=2;
    int last=0;
    if(tot+p[n]>L) return 0;
    fx(i,sta,n){
        if(!vis[i] && p[i]+tot<=L && p[i]!=last){
            last=p[i];
            vis[i]=1;
            if(dfs(tot+p[i],stk,i+1)) return 1;
            vis[i]=0;
            if(tot==0) return 0;
        }
    }
    return 0;
}
int main(){
while(gi(n)!=EOF){
    if(!n) return 0;
    f(i,n) gi(p[i]);
    sort(p+1,p+1+n,greater<int>());
    int MX=accumulate(p+1,p+1+n,0);
    int ans=-1;
    int M2=MX>>1;
    for(int i=p[1];i<=M2;i++){
        if(MX%i!=0) continue;
        L=i;
        ndl=MX/i-1;
        clr(vis);
        vis[1]=1;
        if(dfs(p[1],0,2)){
            ans=i;
            break;
        } 
    }
    pi(ans==-1?MX:ans);
}
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • c/c++ 哈希表 hashtable 概念:用key去查找value 實現hash函數有很多方法,本文用除留餘數法。 除留餘數法的概念: 取一個固定的基數的餘數,註意不能用偶數,用偶數的話,分佈會不均勻 發生衝突時,用鏈地址法解決 圖形入圖: "完整代碼" ...
  • 給定一個二叉樹,找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 最小深度是從根節點到最近葉子節點的 ...
  • 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 。 /** * Definition ...
  • 1.單例模式的定義 單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 2.單例模式的特點 單例類只能有一個實例。 單例類必須自己創建自己的唯一實例。 單例類必須給所有其他對象提供這一實例。 3.單例模式的Java代碼 單例模式分為懶漢式(需要才去創建對象)和餓漢式(創建類的實 ...
  • 平臺:mac 網站:人人網 最近練習爬蟲登陸,方法一是找頁面里的js文件,通過解析js文件找到cookie信息再保持。但現在的站點登陸都有驗證碼,而且最煩的是request時data表單里的值基本上沒有不加密的,js學的不好,就別想著破解了。所以想起了用的比較少的selenium模塊,用於模擬登陸並 ...
  • 及最近部署TP5遇到了很多坑,各種環境下都會出現一些問題,下麵是我記錄的排坑之路 先說最簡單的lnmp一鍵安裝包,我用的是1.5穩定版 安裝命令:wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf ...
  • 說起來做一個支付系統最基礎的就是支付功能了,對於我們來說除了各大銀行以外微信和支付寶也是必選項,畢竟人家這個龐大的用戶群在那裡擺著呢,你不用那不是想著放棄這些用戶麽。 今天我們就來看一看對於我們開發者來說如何快速的進行接入。 首先我們要做的就是先去螞蟻金服開放平臺註冊賬號https://open.a ...
  • 這篇文章主要介紹了Python異常處理總結,需要的朋友可以參考下本文較為詳細的羅列了Python常見的異常處理,供大家參考,具體如下: 1.入門讀物 2.進階讀物 3.Web框架 4.爬蟲開發 5.圖形圖像6.數據分析 7.機器學習等等資料!需要的可以加QQ群:832339352!進群免費獲取! 拋 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...