今晚喫雞——槍械篇

原題鏈接

題目描述

    在絕地求生(喫雞)遊戲裏,不同的槍支有不同的威力,更是可以搭配不同的配件,以提升槍支的性能。

    每一把槍都有其威力及其可裝備配件種類。每一個配件有其所屬種類,可以爲槍支提供威力的百分比加成。每一把槍只能裝備一個同類配件。給你n把槍支和m個配件,槍的威力爲p,可裝備的配件數量爲k,爲k個不同類型的配件,同種類配件只可以裝備一個。配件種類用數字q表示,配件威力加成用一個小數b表示。請你挑選一把槍併爲其搭配配件使其威力最大。

    假設一把槍的威力是p,裝配的k個配件的威力加成是bi,那麼槍最後的威力w=p*(1+b1+b2+…+bk)。



輸入描述:

數據有多組,處理到文件結束。
第一行兩個整數n和m,代表槍支數量和配件數量。
接下來n行,描述n把槍的屬性:第一個整數爲p,代表槍支的威力;第二個整數爲k,代表該槍支可裝備的配件數量;後面k個整數,代表可裝備配件的種類。
接下來m行,描述m個配件的屬性:第一個整數爲q,代表配件的種類,第二個浮點數爲b,代表配件可以爲槍支提供的威力加成。

輸出描述:

每組數據輸出爲一行,輸出一個浮點數,代表合理裝備配件後的槍支最大威力。精確到小數點後4位。
示例1

輸入

3 6
120 3 1 2 3
100 4 1 2 3 4
110 3 2 3 4
1 0.12
2 0.23
2 0.26
4 0.57
3 0.35
5 0.41

輸出

239.8000

說明

對於上面的樣例,正確答案應該是,使用第三把槍,配上第三、四、五個配件。
槍的最終威力就是110*(1+0.26+0.57+0.35)=239.8

備註:

對於100%的數據,
1 <= n,m,k,q <= 1000;
0 <= p <= 1000;
0 <= b <= 1。

解題思路:這是一道看似複雜,其實很簡單的的一道題。算出每個槍支的最大輸出進行比較即可,這裏我是用到結構體來解決這道題的。具體請看源代碼。

源代碼

#include<cstdio>
#include<cstring>
struct note{
    double p;
    int k[1005];//槍支配件種類
    int kk;//配件數
}num[1005];
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        double b[1005],sum=0;
        memset(b,0,sizeof(b));
        for(int i=0;i<n;i++)
        {
            scanf("%lf %d",&num[i].p,&num[i].kk);
            for(int j=0;j<num[i].kk;j++)
            {
                scanf("%d",&num[i].k[j]);
            }
        }
        for(int i=0;i<m;i++)
        {
            int a;
            double bb;
            scanf("%d",&a);
            scanf("%lf",&bb);
            if(bb>b[a])//相同配件去大值
                b[a]=bb;
        }
        for(int i=0;i<n;i++)
        {
            double bb=0;
            for(int j=0;j<num[i].kk;j++)
            {
                bb+=b[num[i].k[j]];     //配件總加成
            }
            double Max=num[i].p*(1+bb);
            if(Max>sum)             //比較槍支輸出大小
                sum=Max;
        }
        printf("%.4lf\n",sum);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章