扫码支付如今已普及应用在大型超市,街边小贩等多个消费支付的场景,刷脸支付也在商超零售场景逐渐应用,很多的大型超市引进自助收银系统,实现自助结账应用。
已知某超市有自助收银机m台,每件商品扫码时间都相等,均为1秒,现有n个顾客准备结账,初始顺序已经确定为1-n,编号i号顾客购买的商品件数为ci,当其中某名顾客扫完所有商品后,下一名排队等候付款的顾客马上使用刚空闲的这台自助收银机,即忽略支付时间和自助收银机换人的时间开销,则所有顾客完成结账需要多少时间?
输入格式:
输入第一行为两个正整数n和m(1 ≤ n ≤ 10000,1 ≤m≤ 20),中间用一个空格隔开,分别表示待结账顾客人数和自助收银机台数。 第二行n个整数c1、c2、…、cn(1 ≤ci≤ 100),每两个整数之间用一个空格隔开,ci表示i号顾客购买的商品件数。
输出格式:
输出只有一个正整数,即所有顾客完成结账的总时间。
输入样例1:
5 3
4 4 1 2 1
输出样例1:
4
输入样例2:
8 4
23 71 87 32 70 93 80 76
输出样例2:
163
样例1说明:
第1秒,3名顾客扫码。第1秒结束时,1、2、3号顾客每人已扫码商品1件,3号顾客完成结账,4号顾客接替3号顾客开始扫码。第3秒结束时,1、2号顾客每人已扫码商品3件,4号顾客的已扫码商品2件。4号顾客完成结账,5号顾客接替4号顾客开始扫码。第4秒结束时,1、2号顾客每人已扫码商品4件,5号已扫码商品1件。1、2、5号完成结账,即所有人完成结账。总结账时间为4 秒。
解题思路:先把结算队伍的人数纪录下来t便于去后面赋值,然后便利去每次减一,然后时间++。如果等于0了那么就把队伍之后的人赋值给这个位置,然后t++,最后的退出条件就是队伍全部都为0了那么说明排完了,退出循环,输出时间。
思路不懂可看代码注释很详细。
#include<bits/stdc++.h>
using namespace std;
int a[10010]={0};
int main(){
int n,m;
cin>>n>>m;
int t=m;//等下用于找后面的人的位置
for(int i=1;i<=n;i++){
cin>>a[i];
}
int sum=0;
while(true){
int br=0;
for(int i=1;i<=m;i++){//便利队伍
if(a[i]==0){//如果当前的人结算完毕
if(a[t+1]!=0){//并且他排队的后一个人是没买单过的
a[i]=a[++t];//后面那个人跑到这个位置
}else
a[i]=0;
}
if(a[i]!=0)//还可以买单才能--
a[i]--;
}
sum++;//扫了一秒了时间++
for(int i=1;i<=m;i++){
if(a[i]==0){//在这里加这个防止开始1 1 1 5 5 5然后三个0直接退出了、一开始wa了一发这里
if(a[t+1]!=0){
a[i]=a[++t];
}else
a[i]=0;
}
if(a[i]==0)br++;//如果全部都是0了说明当前和之后都买完了
}
if(br==m)break;//退出循环
}
cout<<sum<<endl;
return 0;
}