> 文档中心 > C++ 订餐

C++ 订餐

题目描述:

餐馆提供 n 个菜品编号从 1 到 n,第 i 号菜品的数量为 ai,价格为 ci,共有 m 个客人来预订,第 j 个客人需要预订 tj
号菜品 dj 份。

每当客人需要一份编号为 i 的菜品时,餐馆可以执行以下操作:

给他一份编号为 i 的菜品,客人支付对应菜品的价格 ci ;

如果需要的菜品没有了,那么餐馆可以给他一份最便宜的且有余量的菜品;

如果无法继续提供任何菜品,那么当前客户会生气地离开;

若一个客户得到的菜品数量达到 dj 份,那么该客户的花费 costj 将会是这 dj 份菜品的价值之和。

如果一个客户生气地离开了,那么已经提供的菜品是无法退回到可用菜品里。请你计算每个客人的花费。

输入格式:

第一行包含两个整数 n 和 m (1≤n,m≤2∗104)

第二行包含 n 个整数 a1,a2,…,an (1≤ai≤105)

第三行包含 n 个整数 c1,c2,…,cn (1≤ci≤107)

接下来的 m 行,每行包含两个整数 tj 和 dj (1≤tj≤n,1≤dj≤105),表示第 j 个客户所需要的菜品种类和数量。

输出格式:

一共 m 行,第 j 行表示第 j 个客人需要支付的费用。

输入样例18 58 6 2 1 4 5 7 56 3 3 2 6 2 3 22 81 44 73 46 10输出样例12224141039输入样例26 66 6 6 6 6 66 66 666 6666 66666 6666661 62 63 64 65 66 66输出样例2363963996399963999960输入样例36 66 6 6 6 6 66 66 666 6666 66666 6666661 62 133 64 115 66 6输出样例3361105899996433332600

CODE

#includeusing namespace std;int main(){int n,m;cin>>n>>m;int num[20010],price[20010];for(int i=0;i<n;i++){cin>>num[i];}for(int i=0;i<n;i++){cin>>price[i];}for(int i=0;i<m;i++){int choice,amount,cost=0;cin>>choice>>amount;choice-=1;if(num[choice]>=amount){cost+=amount*price[choice];num[choice]-=amount;}else{cost+=num[choice]*price[choice];amount-=num[choice];num[choice]=0;while(true){int mark=-1,min=10000001;if(amount==0){break;}for(int i=0;i<n;i++){if(num[i]>0 and price[i]<min){mark=i;min=price[i];}}if(mark==-1){cost=0;break;}if(num[mark]>amount){cost+=price[mark]*amount;num[mark]-=amount;break;}else{cost+=num[mark]*price[mark];amount-=num[mark];num[mark]=0;}}}cout<<cost<<endl;}return 0;}

在这里插入图片描述

朋友们点赞是我更新最大的动力,明天再见,拜拜!!!