題意:
在遙遠的東方,有一家糖果專賣店。
這家糖果店將會在每天**一些糖果,它每天都會生產出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想知道在...