思路
题目大意就是说你现在要买一些食品,如果你现在买的食品是套餐中的,且单买价比套餐价要高,那就会把买单个改为买套餐,求买食品需要花费多少钱。
很简单,直接根据规则进行模拟即可。
首先我们先把要买的东西的食品编号用桶的思想储存起来,假设编号为 x x x,我们定义以为数组 b u y i buy_i buyi 表示在要买的食品中,食品编号为 i i i的食品要买多少个。
然后我们不看别的,只看套餐里的东西。 先一直循环,然后枚举套餐里的食品编号,接着一份一份的来看。 假设现在枚举到了套餐里的第 i i i 个物品。如果 b u y p i = 0 buy_{p_i}=0 buypi=0 即要买东西中没有 p i p_i pi 则此时什么也不用做。如果 b u y p i > 0 buy_{p_i}>0 buypi>0 即要买的东西中有 p i p_i pi 则我们先定义一个变量 t o t tot tot 来记录套餐和要买的东西中单买一份的总价格。 则此时 t o t ← t o t + c p i tot \gets tot+c_{p_i} tot←tot+cpi。 最后,如果 t o t > x tot>x tot>x 即单买价格超过了套餐价格,设最终答案为 a n s ans ans 则此时 a n s ← a n s + x ans\gets ans+x ans←ans+x。并且将单买中选过的食品 i i i 的 b u y i ← b u y i − 1 buy_i\gets buy_i-1 buyi←buyi−1。 如果 x ≥ t o t x \ge tot x≥tot 则什么也不用做,直接跳出循环。
考虑完套餐之后,接下来就只剩单买了,将剩下的要买的东西全部按照单买价进行购买即可。
最后直接输出 a n s ans ans 即可。
代码
#include<iostream>
using namespace std;
int k,c[25];
int x,p[5];
int t,s[25];
int buy[25];
int ans;
int main()
{
//输入
cin>>k;
for(int i=1;i<=k;++i)
{
cin>>c[i];
}
cin>>x>>p[1]>>p[2]>>p[3]>>p[4];
cin>>t;
for(int i=1;i<=t;++i)
{
cin>>s[i];
buy[s[i]]++;//桶
}
//处理套餐中要买的东西
while(1)
{
int tot=0;
for(int i=1;i<=4;++i)
{
tot+=min(buy[p[i]],1)*c[p[i]];
}
if(tot>x)
{
for(int i=1;i<=4;++i)
{
buy[p[i]]=max(buy[p[i]]-1,0);
}
ans+=x;
}
else
{
break;
}
}
//剩下的东西进行单买
for(int i=1;i<=k;++i)
{
ans+=buy[i]*c[i];
}
//输出
cout<<ans<<endl;
return 防抄袭;
}