問題 D 木棍(dp)

2021-10-05 10:22:47 字數 1443 閱讀 8331

題目描述

在乙個原始部落,有一些人要去打獵了,每個人都要挑選自己的工具——兩根木棍。乙個用作遠距離投擲攻擊,乙個用作近距離搏鬥。但是每個人都想挑到最好的,但這是不可能的。但是為了讓多數人滿意,也為了減少大家的矛盾。部落領袖設計了乙個矛盾指數,這個指數就是每個人的不舒服指數和,不舒服指數就(l1-l2)2,其中l1,l2分別是乙個人的兩根木棍的長度。

部落領袖決定讓矛盾指數最少,於是他來向你尋求幫助,希望你能告訴他矛盾指數至少有多少。

輸入第一行兩個數m,n.

表示有n個人,m個木棍。

接下來m個數表示每個木棍(肯定有解)。

(m<=2000,n<=500)

輸出乙個數,最少的矛盾指數。

樣例輸入 copy

5 231

458

樣例輸出 copy

5
思路:首先肯定是排序後挨著取最優,然後dp.

dp[i][j]表示第i個人取到第j個棒子最小答案

dp[i][j]=min(dp[i-1][j-2],mi)+(a[j]-a[j+1])*(a[j]-a[j+1]);

mi要一直更新。

#pragma gcc optimize(3 , "ofast" , "inline")

#include #define rep(i , a , b) for(register int i=(a);i<=(b);i++)

#define per(i , a , b) for(register int i=(a);i>=(b);i--)

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairpi;

templateinline void read (t &x)

while (c >= '0' && c <= '9')

x = x * sign;}

const int maxn = 1e6 + 10;

const int inf = int (1e9);

const ll inf = ll (1e18);

const double pi = acos (- 1);

const int mod = 1e9+7;

const double eps = 1e-8;

int m,n;

ll a[maxn];

ll dp[555][2222];

int main ()

sort (a+1,a+1+m);

rep (i,0,n)

}dp[0][0]=0;

rep (i,1,n)

}ll ans = inf;

rep (i,1,m)

cout<

oj 木棍問題

題目如圖所示 為了避免處理小數誤差,將資料 100處理,二分查詢找到測試長度,然後直到二分區間左右端點相鄰,再測試哪個端點滿足要求,最後換成保留2位小數處理。如下 testb.c testb created by ke tang on 2018 9 19.include include stdlib...

遞迴 木棍問題

問題描述 喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棒的長度都不超過50 個 長度單位。然後他又想把這些木棒恢復到裁截前的狀態,但忘記了初始時有多少木棒以及木 棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棒的長度 都用大於零的整數表示。輸入資料 由多個案例組成...

BZOJ 1044 木棍分割(DP)

題意 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結在一起,總共有n 1個連線處.現在允許你最多砍斷m個連線處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長度最大的一段長度最小。思路 令m m 1,則等價於分成m段使得m段中最長的最小,這個可...