P7791 [COCI2014-2015#7] TETA 题解

信息向阳花木

2021-08-24 16:57:56

Solution

这道题,~~比较水~~ [题目传送门](https://www.luogu.com.cn/problem/P7791) ### 好了,分享思路的时候到了: - 读入时,我们看看这份菜品在不在套餐当中,若在,用桶 $a$ 记录下这份菜品所需的数量;若不在,将这份菜品的单价加到 $ans$ 当中。 - 当数据全部读入完毕时,先用 `while` 循环循环 $t$ 个我想要的菜品,再用 $i$ 把 $n$ 个菜品遍历一遍,当 `a[i]!=0` 时,我们计算: (1)将第 $i$ 个物品的单价加进单价和变量 $cnt$ 中。 (2)将 $a_i$ 减 1,代表这个菜品中的一份我已经处理过了。 (3)计算购买其套餐需要多少钱。 (4)取两个中的最小值,加进答案中。 为什么可以这样做,这样做的依据是什么? 1. `a[i]!=0` 时,当且仅当这个菜品出现在套餐当中。 2. 由于每次 $a_i$ 只减 1,所以,不会出现套餐中重复出现 某一菜品,也就是不会有多个同种菜品被算成 1 个菜品出现在套餐当中了。 3. 这样每次到最后(依然在 `while` 内部)才加上套餐和单价和的最小值,不会把套餐的价格在每个菜品头上都再加一遍。 还不会,就看程序吧。注释都在程序里哦! ### C++ 代码 ```cpp #include <iostream>//尽量缩短代码。 using namespace std; int k,x,t,ans,c[20],p[5],s[20],a[20];//意思与题目和解析里的意思相同。 int main(){ cin>>k; for(int i=1;i<=k;i++)cin>>c[i]; cin>>x; for(int i=1;i<=4;i++)cin>>p[i]; cin>>t; for(int i=1;i<=t;i++){ cin>>s[i]; if(s[i]==p[1]||s[i]==p[2]||s[i]==p[3]||s[i]==p[4]){//若是套餐里的菜品。 a[s[i]]++;//桶计数。 } else ans+=c[s[i]]; } while(t--){ int cnt=0; for(int i=1;i<=k;i++){//用 i 循环遍历 n。 if(a[i]>0){ cnt+=c[i];a[i]--;}} ans+=min(cnt,x); } cout<<ans; return 0; } ```