演算法學習之路|結繩

kissjz發表於2018-02-28

給定一段一段的繩子,你需要把它們串成一條繩。每次串連的時候,是把兩段繩子對摺,再如下圖所示套接在一起。這樣得到的繩子又被當成是另一段繩子,可以再次對摺去跟另一段繩子串連。每次串連後,原來兩段繩子的長度就會減半。

給定N段繩子的長度,你需要找出它們能串成的繩子的最大長度。

輸入格式

每個輸入包含1個測試用例。每個測試用例第1行給出正整數N (2 <= N <= 104);第2行給出N個正整數,即原始繩段的長度,數字間以空格分隔。所有整數都不超過104。

輸出格式

在一行中輸出能夠串成的繩子的最大長度。結果向下取整,即取為不超過最大長度的最近整數。

輸入樣例:
8
10 15 12 3 4 13 1 15
輸出樣例:
14
我的思路

利用multiset優先選取較大的對摺,再小的。

直到對摺結束為止。

推薦使用動態規劃的方法,更精確。

以下屬於第一種方法(最後幾個沒AC):

#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    multiset<double> v;
    double tmp;
    for(int i=0;i<n;i++){
        cin>>tmp;
        v.insert(tmp);
    }
    double a,b;
    while(v.size()!=1){
        a=*v.begin();
        v.erase(v.begin());
        b=*(v.begin());
        
        v.erase(v.begin());
        
        v.insert((a+b)/2);
    }
    printf("%.0f",*v.begin());
}


相關文章