烹调方案(洛谷-P1417)
題目描述
一共有n件食材,每件食材有三個(gè)屬性,ai,bi和ci,如果在t時(shí)刻完成第i樣食材則得到ai-t*bi的美味指數(shù),用第i件食材做飯要花去ci的時(shí)間。
眾所周知,gw的廚藝不怎么樣,所以他需要你設(shè)計(jì)烹調(diào)方案使得美味指數(shù)最大
輸入輸出格式
輸入格式:
第一行是兩個(gè)正整數(shù)T和n,表示到達(dá)地球所需時(shí)間和食材個(gè)數(shù)。
下面一行n個(gè)整數(shù),ai
下面一行n個(gè)整數(shù),bi
下面一行n個(gè)整數(shù),ci
輸出格式:
輸出最大美味指數(shù)
輸入輸出樣例
輸入樣例#1:
74 1
502
2
47
輸出樣例#1:
408
思路:
一開(kāi)始沒(méi)想明白,看了 tinylic 大佬的解釋后才明白的
如果沒(méi)有 b 屬性的話(huà),那么是一個(gè)標(biāo)準(zhǔn)的 01 背包題
根據(jù)題意,假設(shè)現(xiàn)在已經(jīng)耗費(fèi)了 t 時(shí)間,那么有:
-
a[x]-(t+c[x])*b[x]+a[y]-(t+c[x]+c[y])*b[y]
-
a[y]-(t+c[y])*b[y]+a[x]-(t+c[y]+c[x])*b[x]
化簡(jiǎn)后,得到式1>式2的條件是 c[x]*b[y]<c[y]*b[x],因此只要滿(mǎn)足這個(gè)條件的物品對(duì)(x,y),x在y前的代價(jià)永遠(yuǎn)最優(yōu),根據(jù)這個(gè)條件排序后,就是簡(jiǎn)單的01背包
源代碼
#include<iostream> #include<algorithm> using namespace std;int max(int x,int y) {if(x>y) return x;else return y; }struct food{//結(jié)構(gòu)體long long ai;long long bi;long long ci; }arr[10000000];bool cmp(food x,food y) {return x.ci*y.bi<y.ci*x.bi;//比較美味度 }long long dp[10000000]={0}; int main() {long long t,n;long long i,j;long long result=0;cin>>t>>n; //到達(dá)地球時(shí)間與食物個(gè)數(shù)for(i=1;i<=n;i++) cin>>arr[i].ai;//屬性afor(i=1;i<=n;i++) cin>>arr[i].bi;//屬性bfor(i=1;i<=n;i++) cin>>arr[i].ci;//屬性csort(arr+1,arr+1+n,cmp);//對(duì)各種食材的美味度進(jìn)行比較for(i=1;i<=n;i++)//遍歷每種食材for(j=t;j-arr[i].ci>=0;j--)//至各食材制作時(shí)間等于總時(shí)間為止dp[j]=max(dp[j],dp[j-arr[i].ci]+arr[i].ai-j*arr[i].bi);//arr[i].ai-j*arr[i].bi即美味指數(shù)for(i=1;i<=t;i++) result=max(result,dp[i]);//尋找最大值cout<<result<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的烹调方案(洛谷-P1417)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数列分段`Section II`(洛谷-
- 下一篇: 有线电视网(洛谷-P1273)