原題鏈接
題目描述
每一把槍都有其威力及其可裝備配件種類。每一個配件有其所屬種類,可以爲槍支提供威力的百分比加成。每一把槍只能裝備一個同類配件。給你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位。
輸入
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;
}