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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...