博知楼终于安好饮水机了,ycb迫不及待要去接水,但是他到那里才发现前面已经有n个同学了。他数了数,饮水机一共有m个接水口。所有的同学严格按照先来后到去接水(m个接水口同时工作,哪个水龙头有空人们就去哪里,如果n<m,那么久只有n个接水口工作)。每个人都有一个接水的时间,当一个人接完水后,下一秒另一个人马上去接,不会浪费时间。ycb急着去做题,所以他想知道什么时候才能轮到他。
第一行两个整数 n和m,表示ycb前面有n个同学,饮水机有m个接水口。(n,m <= 1000)
第二行n个整数,表示每个同学的接水时间。
一行,一个数,表示轮到ycb接水的时间
4 2
1 1 1 1
3 当时见到这个题时,只是觉得前面的n个人所用的 时间不一样,那么当前面的节水机正在被用的时候,你就得等着,如果 有人完成了,你还得看那个接水的时间最短即最快,所以感觉好麻烦,但是通过和别人交流,知道这个题的数据比较小, 通过for循环比较直接得出最小时间的接水机。听说寻找最小值能用最小堆来实现,等我再修炼一下再来改吧。#include<stdio.h> #include<string.h> #include<math.h> #include<queue> using namespace std; int main() { int n,m,point; if(n<m)///当n<m时,只有n个接水机能用。 m=n; int shi[1001],shui[1001]; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%d",&shi[i]);//前面n个人所用的时间,因为先来先接,所以用数组盛起来,从头便利即模拟来的顺序。 } for(int i=0;i<m;i++) { shui[i]=0;//所有能用的接水机的时间。初始化为0是为了后面累加显示当前的时间 } int mm; for(int i=0;i<n;i++) { mm=99999999;//对每个人来说,都要去时间最短的去,即都需要判断最小值。 for(int j=0;j<m;j++) { if(shui[j]<mm) { mm=shui[j]; point=j; } } shui[point]+=shi[i];//在时间最短的接水机的数组里面加上当前这个人的时间。 } mm=99999999;//重新为最大值,目的是为了下面的找最小值 for(int i=0;i<m;i++) { if(shui[i]<mm) { mm=shui[i];//找最小值 } } printf("%d\n",mm+1); } }
另外,这个题目用贪心法来实现,但是我都不知道什么是贪心法,学过之后再回来改吧