top1编程
← 返回题目
题解

【基础】接水问题

2 条题解

  • 0
    @ 2026-7-29 20:22:47
    /*
    【解题思路:排队接水——谁先空出来,谁就接新人】
    小朋友们,这道题和我们之前做的“排队打水”有一点小小的不同:
    之前那道题是大家可以【自由选队】,所以动作快的人先排队;
    而这道题是【初始顺序已经固定了】,每个人必须按照 1 到 n 的顺序乖乖去接水。
    
    怎么模拟这个过程呢?我们可以把 m 个水龙头想象成 m 个“正在倒计时的沙漏”(也就是数组 a[1] 到 a[m]):
    1. **初始状态**:最开始,前 m 个同学各占一个水龙头。
    2. **接力游戏**:从第 m+1 个同学开始,大家在后面排队。谁该上场呢?
    * 哪个水龙头前面的人【先接完】(也就是哪一个水龙头累计的水量最少,对应代码里的 `min`),排队的第一名就立刻冲过去接替他。
    * 冲过去之后,这个水龙头就要【加上新同学的接水量】(`a[min] += x`),继续累计时间。
    3. **最终时间**:当所有人都被分配完之后,哪个水龙头累计的接水时间最长(对应代码里的 `max`),就代表那个水龙头最后关闭,也就是所有人接完水的总时间!
    
    我们通过维护一个大小为 m 的数组,每次都在 m 个水龙头里“找最小、加新值”,最后“找最大输出”
    */
    
    #include <bits/stdc++.h>
    using namespace std;
    
    // a 数组用来记录 m 个水龙头各自累计的接水总时间(也就是当前水龙头什么时候会空出来)
    int n, m, a[110];
    
    int main(){
    	int i, j, x, min;
    	cin >> n >> m; // 输入总人数 n 和水龙头个数 m
    	
    	for(i = 1; i <= n; i++){
    		cin >> x; // 输入当前排队到的小朋友的接水量
    		
    		// 在现有的 m 个水龙头里,寻找哪一个水龙头会最先空出来
    		min = 1; // 先假设第 1 个水龙头是最快空出来的
    		for(j = 2; j <= m; j++){
    			if(a[j] < a[min]){
    				min = j; // 如果发现了更早空出来的水龙头,就更新最快水龙头的编号
    			}
    		} 
    		
    		// 让当前排队的小朋友去这个最先空出来的 `min` 号水龙头接水
    		// 这个水龙头结束工作的时间就要往后延长 x 秒
    		a[min] += x;
    	}
    	
    	// 所有人都上场接完水了,现在我们要看哪个水龙头坚持到了最后
    	int max = a[1];
    	for(i = 2; i <= m; i++){
    		if(a[i] > max){
    			max = a[i]; // 找出累计时间最长的那个水龙头
    		}
    	}	
    	
    	// 输出最大时间,就是整个水房所有人接完水的总时间
    	cout << max << endl; 
    	
    	return 0;
    }
    
    • 0
      @ 2026-7-28 22:44:44
      #include <bits/stdc++.h>
      using namespace std;
      
      int n,m,a[110];
      int main(){
      	int i,j,x,min;
      	cin>>n>>m;
      	for(i = 1;i <= n;i++){
      		cin>>x;
      		min = 1;
      		//m个水龙头找最小值存入
      		for(j = 2;j <= m;j++){
      			if(a[j] < a[min]){
      				min = j;
      			}
      		} 
      		
      		a[min] += x;
      	}
      	
      	//找最大值
      	int max = a[1];
      	for(i = 2;i <= m;i++){
      		if(a[i] > max){
      			max = a[i];
      		}
      	}	
      	cout<<max<<endl; 
      }
      
      • 1