openjudge 1.9.15 接水问题

OpenJudge - 15:接水问题


解题思路:

1.由题可知,需要计算总的排队接水时间,有n个同学接水,有m个水龙头,因为每个同学的接水时间时不一样的,所以我们可以利用数组来存储每个学生的接水时间,n的范围是10000,所以开一个10005大小的数组即可

2.然后利用循环,将n个同学各自的接水时间存入数组,此时对数组开始进行数据处理

3.首先分析,如果n<=m的话,意思为水龙头是够用的,而且水龙头同时开的话,接水量最多的那个同学是用时最长的,所以接水时间,就是数组中最大的那个数

4.如果n>m的话,意思有替补学生,必须等其他学生接完水后,才可以去接水,所以我们可以设置一个书签k=m+1,来标记后面排队学生的位置,可以确定前m个学生是可以同时接水的,所以,第一个接完水的是接水量最少的那个同学,那么我们可以在数组1-m的位置找出那个最小值min,即为最快接完水的时间sum=sum+min,然后对这个m个数据进行处理,如果数字为min,那么这个学生i就是接完水的,下一个等待的学生要替补过来,即a[i]=a[k],进行赋值,并且书签往后移动,下一次就是第二个替补的学生去接水,k++,其他的学生接水量减去min,意思他们还没接完,但是已经接了min的水了,直到后面所有的排队学生都已经在水龙头面前了,那就又回到了第3步,只需要找到最大的那个值max,然后累加到计时器里即可sum=sum+max


#include<bits/stdc++.h>
using namespace std;
int a[10005];//定义一维数组存放数据 
int main()
{
	int n,m;
	cin>>n>>m;

	for(int i=1;i<=n;i++)
	cin>>a[i];//将n个数据输入到一维数组中 

	int k=m+1,sum=0;

	while(k<n+1)//如果k后续排队的已经都完了,结束循环 
	{
		int min=1000000;

		for(int i=1;i<=m;i++)
		{
			if(a[i]<min)
			min=a[i];//找到最小值,意思为这轮最快接完水的 
		}

		sum=sum+min;//计时器加上第一轮接完水所用的时间 

		for(int i=1;i<=m;i++)//对m个水轮头数据处理 
		{
			if(a[i]!=min)//如果不是最快接完的 
			a[i]=a[i]-min;//减去接水量 
			else
			{
				a[i]=a[k];//如果是接完水的,则后面的开始排队接替 
				k++;//接替人数往后移 
			}
		}
	}

	int max=0;//所有后续人数全部接替后 

	for(int i=1;i<=m;i++)//找到最大值,意思为最久接水量的同学时间用的最长 
	{
		if(a[i]>max)
		max=a[i];
	}

	sum=sum+max;//累加器加上最后一轮的时间 
	cout<<sum;
	return 0;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值