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