1.玩具裝箱(toy.pas/c/cpp) time limit: 1000ms memory limit: 256m
***喜歡玩具,家裡有n個玩具,有一天,她想讓玩具們曬曬太陽,***把所有的玩具都拿出來擺成一排,從左到右依次編號為1~n。每個玩具大小不一,玩具i的大小為ai。
太陽下山了,***開始收玩具了,現在將這些玩具從左開始依次裝成若干箱,每個箱子只能裝最多m個且編號連續的玩具。在某個箱子裡裝若干個玩具的費用計算方法:如果該箱子裡最大的玩具為a,最小的為b,玩具個數為s,則費用為k+s*(a-b)。這裡的k是箱子本身的費用,所有箱子的費用都相等。
***想知道把將所有玩具都裝進箱裡的最小費是多少?
第一行為3個整數n, m, k,用空格分隔。n為玩具個數,m為每個箱子最多能裝的玩具個數,k為箱子本身的費用。
以下n行第i行(1<=i<=n)為整數ai,表示第i個玩具的大小。
輸出為乙個整數,表示裝箱費用總和的最小值。
toy.in
6 3 6
1 2
3 1
2 1
toy.out
21樣例解釋:
第乙個箱子裡裝玩具1~3,第二個裡裝4~6,開銷總和為(6+3×(3−1))+(6+3×(2−1)) = 21。這是最小可能的開銷總和,所以輸出21。
60%的資料滿足:n,m<=20;
80%的資料滿足:n<=2 000,m<=100;
100%的資料滿足:1<=n<=20 000,1<=m<=1 000,0<=k<=1 000 000 000,
1<=ai<=1 000 000 000 (1<=i<=n),m<=n
很難受,寫了乙個半小時只拿了20分
當模擬+數論題在寫,結果發現還是要寫dp
結果方程出不來,看來hsj大佬的才知道還要先初始化(就很氣)
言歸正傳
先把從 i 開始到 j 的最大最小值都求出來,然後把它的值也求出來
再用陣列存起來
再把它當揹包做,沒了
但是因為它的值可能是 m*(max-min) 所以會爆int
嗯,建議把inf設為0x3fffffffffffffff (15個f,long long的最大值)
#include
#include
#define ll long long
const ll inf=0x3f3f3f3f3f3f;
using
namespace
std;
int a[20005],n,m,k;
ll f[20005],zhi[20005][1005]; //記憶體800兆左右,但是題目限制其實256兆
int main()
printf("\n");
} //預處理
for(int i=1;i<=n;i++) f[i]=inf;
for(int i=1;i<=n;i++)
for(int j=1;j<=m&&(i-j+1)>0;j++)
f[i]=min(f[i],f[i-j]+zhi[i-j+1][j]);
printf("%i64d\n",f[n]);
return
0;}
注釋也說了,這個記憶體超了很多
那麼有沒有優化呢
答案是有的(雖然是別人寫的)
#include
#include
using
namespace
std;
const
int maxn = 20005;
typedef
long
long int64;
const int64 inf = 1e18;
int a[maxn],n,m,k;
int64 dp[maxn];
int main()
}printf("%i64d\n",dp[n]);
return
0;}
NOIP模擬 好題 分玩具
題目描述 豆豆和豆沙正在分一些玩具,每個玩具有乙個好玩值,每個人可以拿走任意數量的玩具,獲得的愉快度為最小的好玩值。現在豆豆先拿,每個人輪流操作,直到沒有玩具可以拿。豆豆想知道他能比豆沙多出多少愉快度?輸入格式 第一行 n 表示玩具個數。接下來一行 n 個整數表示第 i 個玩具的好玩值。輸出格式 輸...
斜率優化DP 玩具裝箱
hnoi2008 玩具裝箱toy time limit 1000ms memory limit 165536k total submit 5 accepted 5 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意...
玩具裝箱TOY 斜率優化DP
更新提示 第一次更新 正文 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為 1.n 的 n 件玩具,第 i 件玩具經過壓縮後變成一維長度為 c i 為了方便整理,p 教授要求在乙...