牛客網練習賽7 購物 動態規劃

2021-10-08 19:47:42 字數 1903 閱讀 8243

題意:

在遙遠的東方,有一家糖果專賣店。

這家糖果店將會在每天**一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果**為c[i][j]元。

現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。(因為最多隻生產m個)買來糖果以後,你可以選擇吃掉糖果或者留著之後再吃。糖果不會過期,你需要保證這n天中每天你都能吃到至少乙個糖果。

這家店的老闆看你經常去光顧這家店,感到非常生氣。(因為他不能好好睡覺了)於是他會額外的要求你支付點錢。具體來說,你在某一天購買了 k 個糖果,那麼你在這一天需要額外支付 k2 的費用。

那麼問題來了,你最少需要多少錢才能達成自己的目的呢?

題解:

動態規劃+貪心

因為題目要求的是花最少的錢,所以首先我們只買能滿足要求的最少的糖果,也就是n個

其次,我們要先買每天便宜的糖果,所以我們把每天提供的糖果進行排序,方便處理

但是,題目給了乙個限定條件 「你在某一天購買了 k 個糖果,那麼你在這一天需要額外支付 k² 的費用。」根據這句話,我們得知這題需要用dp來進行做。

dp[i][j]表示 表示第i天總共買j個糖果的最低**

1.第一維我們列舉天數

2.第二維我們列舉總共買了多少個糖果:這裡有一點要注意

for

(int j=i;j<=

min(n,i*m)

;j++

)

為什麼這樣寫呢,n=3 m=2的情況,第一天只有兩個糖果,所以我們只能買兩個糖果也就是1*2=2

3.第三維列舉 在這些天前,我們買了多少個糖果

也就是在這天,我們買了 j - k 個糖果

因為你需要保證這n天中每天你都能吃到至少乙個糖果,所以要注意第三維的起始糖果數。

/*keep on going never give up*/

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

#include

#include

#include

#include

#include

#include

#include

//#define int long long

#define ios std::ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);

#define endl '\n'

const

int maxn =

310;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int mod =

1e9+7;

const

double pi=

acos(-

1);using

namespace std;

int a[maxn]

[maxn]

;int dp[maxn]

[maxn]

;int

main()

dp[0]

[0]=

0;for(

int i=

1;i<=n;i++)}

} cout<[n]

}

牛客練習賽7 B購物

題意 略思路 貪心,題意換一種理解方式就是 每天要選乙個,這乙個可以從包括這一天的之前的任意一天選 選過的不能選 再附加考慮 k 這個條件,每次選花費最小的乙個 include include include include include include include include inclu...

牛客網練習賽33

tokitsukaze最近沉迷一款rpg。這個rpg一天有k分鐘,每一天從第1分鐘開始。有n種怪物,第i種怪物每天第一次出現的時間為xi分鐘,第二次出現的時間為2 xi分鐘,第三次出現的時間為3 xi分鐘.同一時刻出現的怪物種類越多,打怪獲得的經驗也越高。為了高效練級,tokitsukaze想知道在...

牛客網練習賽33

tokitsukaze最近沉迷一款rpg。這個rpg一天有k分鐘,每一天從第1分鐘開始。有n種怪物,第i種怪物每天第一次出現的時間為xi分鐘,第二次出現的時間為2 xi分鐘,第三次出現的時間為3 xi分鐘.同一時刻出現的怪物種類越多,打怪獲得的經驗也越高。為了高效練級,tokitsukaze想知道在...