2013-02-06 22:01:41Morris

[ZJ] a281. 成為賢惠家庭主婦的第一步從購買划算的食譜開始

內容 :

小平是個孝順又懂得理財的乖孩子,為了幫家裡節省開銷,他決定從吃飯的費用開始著手
。從長遠來看,一本食譜划算與否和食譜的價格並不是絕對關係,而是要看這本食譜提供
的料理是否經濟實惠,換言之,小平應該要購買料理C/P值最高的那本食譜。所謂的C/P值
,即capability/price,也就是料理的等級/成本,因為每份料理的份量不同,同樣的花費
,可以提供給比較多人吃的就相對成本較低,所以成本的定義即為材料的總花費/可製成的
份數,而料理的等級需同時考慮食材的好壞和使用食材的多樣化,因此定義料理的等級為
食材的平均等級*食材種類數,一份料理需要多種食材,食材的等級與食材的高級程度及
新鮮度有關,所以每種食材的等級以食材高級程度*食材新鮮度計算,料理的食材平均等
級不需考慮每份食材的用量不同。書店的每本食譜各提供一道料理,請在小平買得起的食
譜中,找出料理C/P值最高的那本,計算小平買完食譜後,還剩多少錢可以存回他的小豬撲
滿。保證C/P值最好的只有一本食譜。

p.s. 我們假設平媽十分厲害,在製作料理的過程中並不會浪費或多加任何材料。

輸入說明 :

多組輸入以EOF結束 
 
輸入的第一行含兩個整數y和p,0<=y<=10^9,0<=p<=100,y代表小平擁有的錢,p代表書店
的食譜數量。接下來有p次輸入,每次含4個整數s,h,i,k,1<=s<=10^9,1<=h<=5000,
1<=i<=20,1<=k<=10,s代表每本食譜的價格,h代表每本食譜的頁數,i代表每本食譜的料
理的食材數,k代表每一人份的重量。接著每一次s,h,i,k之後有i次輸入,每次含
5個整數a,b,c,d,e,1<=a<=100,1<=b<=100,1<=c<=100,1<=d<=1000,1<=e<=10,
a代表每份食材的價格,b代表小平家所買的該種食材的新鮮程度,c代表每份食材的高級程
度,d代表每份食材的重量,e代表每份食材在製作該道料理時需要的數量。請參考範例輸
入。

輸出說明 :

輸出一個整數,代表小平買完食譜後剩下多少錢。

範例輸入 :

5000 2
2000 300 3 5
50 80 60 200 2
25 20 70 10 8
30 70 100 50 7
1500 400 4 2
5 60 95 500 2
10 75 35 100 3
10 25 80 200 5
90 90 90 50 2

範例輸出 :

3500

提示 :

出處 :

(管理:VacationClub)

這題沒有什麼技巧,最煩的是在讀題。
我曾經因為讀題失敗,也就是腦中的堆疊記憶體不夠,遲遲無法理解題目要求什麼。
食譜-料理-材料 的階層關係一直搞不懂,現在才來寫這題,
至於下面的代碼是不是正確的?我只能說可以通過測資,我還看不是很懂。

#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
    int Y, P;
    int S, H, I, K;
    int A, B, C, D, E;
    int i, j, k;
    while(scanf("%d %d", &Y, &P) == 2) {
        double CP = -1;
        int resS = 0;
        while(P--) {
            scanf("%d %d %d %d", &S, &H, &I, &K);
            double avgL = 0, COST, totCOST = 0, tmpCP;
            int W = 0xffff;
            for(i = 0; i < I; i++) {
                scanf("%d %d %d %d %d", &A, &B, &C, &D, &E);
                double L = C*B;
                avgL += L;
                W = min(W, D/E);
                totCOST += A;
            }
            COST = totCOST/W;
            tmpCP = avgL/COST;
            if(tmpCP > CP) {
                CP = tmpCP, resS = S;
            }
        }
        printf("%d\n", Y-resS);
    }
    return 0;
}