2 条题解

  • 0
    @ 2026-3-15 14:40:46
    #include <iostream>
    using namespace std;
    int main() {
        // n: 接水人数, m: 水龙头个数
        int n, m;
        cin >> n >> m;
          // 创建数组存储每个人的接水量
        int w[10005];  // 因为n最大10000,多开一点空间
         // 读入每个人的接水量
        for (int i = 1; i <= n; i++) {
            cin >> w[i];
        }
        // 创建数组存储每个水龙头的剩余接水时间
        // 一开始,前m个人分别占用m个水龙头
        int taps[105] = {0};  // 水龙头剩余时间,m最大100
        // 初始化:前m个人开始接水
        for (int i = 1; i <= m; i++) {
            taps[i] = w[i];
        }
        // 记录当前要安排的第几个人(从第m+1个人开始)
        int nextPerson = m + 1;
        
        // 记录总时间
        int time = 0;
        // 当还有人没接完水时,继续循环
        while (nextPerson <= n) {
            // 找出当前剩余时间最少的水龙头
            int minTime = 1000000;  // 先设一个很大的数
            int minIndex = 1;
            
            for (int i = 1; i <= m; i++) {
                if (taps[i] < minTime) {
                    minTime = taps[i];
                    minIndex = i;
                }
            }
            
            // 时间流逝minTime秒
            time = time + minTime;
            // 所有水龙头的剩余时间减去minTime
            for (int i = 1; i <= m; i++) {
                taps[i] = taps[i] - minTime;
            }
            
            // 把下一个接水的人安排到空出来的水龙头
            taps[minIndex] = w[nextPerson];
            nextPerson++;
        }
        
        // 最后,找出所有水龙头中剩余时间最长的
        int maxTime = 0;
        for (int i = 1; i <= m; i++) {
            if (taps[i] > maxTime) {
                maxTime = taps[i];
            }
        }
        // 总时间 = 已经过的时间 + 最后一批人接完需要的时间
        time = time + maxTime;
        // 输出结果
        cout << time << endl;
        return 0;
    }
    
    
    • 0
      @ 2024-9-26 15:06:39

      C++ :

      #include<iostream>
      using namespace std;
      int T[200];
      int main()
      {
      	int n,m,t;
      	cin >> n >> m;
      	for(int i=0; i<n; ++i)
      	{
      		cin >> t;
      		int min_index = 0;
      		for(int j=1; j<m; ++j)
      		{
      			if(T[j] < T[min_index])
      				min_index = j;
      		}
      		T[min_index] += t;
      	}
      	int max_index = 0;
      	for(int i=1; i<m; ++i)
      	{
      		if(T[i] > T[max_index])
      			max_index = i;
      	}
      	cout << T[max_index] << endl;
      	return 0;
      }
      

      Pascal :

      var a:array[1..11000] of integer;
          b:array[1..100] of integer;
          i,j,n,m,next,sum:longint;
      function check:boolean;
      var i:integer;
      begin
        for i:=1 to m do if a[b[i]]>0 then exit(true);
        check:=false;
      end;
      begin
        readln(n,m);
        for i:=1 to n do read(a[i]);
        for i:=1 to m do b[i]:=i;
        next:=m+1;
        repeat
          for i:=1 to m do
          begin
            dec(a[b[i]]);
            if a[b[i]]=0 then
            begin
              b[i]:=next;
              inc(next);
            end;
          end;
          inc(sum);
        until not check;
        writeln(sum);
      end.
      
      • 1

      信息

      ID
      581
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      13
      已通过
      6
      上传者