3 条题解

  • 0
    @ 2025-10-16 20:51:50
    #include<stdio.h>
    
    int main(){
    	
    	int n,m;
    	scanf("%d %d",&n,&m);
    	
    	int i,j;
    	int tot[50];
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&tot[i]);
    	}
    	//冒泡排序 
    	for(i=0;i<n-1;i++)
    	{
    		for(j=0;j<n-1;j++)
    		{
    			if(tot[j]>tot[j+1])
    			{
    				int temp=tot[j];
    				tot[j]=tot[j+1];
    				tot[j+1]=temp;
    			}
    		}
    	}
    	//水龙头归零 
    	int water[50];
    	for(i=0;i<m;i++){
    		water[i]=0;
    	}
    	//贪心 
    	int sum=0;
    	int minsize;
    	
    	for(i=0;i<n;i++){
    		minsize=0;
    		for(j=0;j<m;j++){
    			if(water[j]<water[minsize]){
    				minsize=j;
    			}
    		}
    		water[minsize]+=tot[i];
    		sum+=water[minsize];
    	}
    	printf("%d",sum);
    	
    	return 0;
    	
    }
    
    • 0
      @ 2025-10-4 10:45:23

      这道题要用什么算法其实是写在标签里了,这个算法就叫贪心算法。贪心算法主要就是在每一步都找这一步最快的方法,也就是说,假如要先让一个人打水,得让打水最快的来,就能最快地走完这一步,然后第一个人就不用管了,后面的也是重复这个步骤。

      不过,题目有个要读懂的点,总时间是什么意思?比如说,假设有3个人到一个水龙头打水,他们打水的时间分别是1, 2, 3(单位: min), 对于第一个打水的人来说要1(min),第二个打水的人来说要1 + 2 = 3(min),对于第三个打水的人来说要1 + 2 + 3 = 3 + 3 = 6(min)。总时间就是 1 + 3 + 6 = 10(min),当然,这也是最短的总打水时间。所以一个人需要的打水时间是 排队时间 + 自己的打水时间,总的打水时间就是 每个人需要的打水时间之和。

      写成数学公式更容易看些:

      一个人需要的打水时间=排队时间+自己的打水时间一个人需要的打水时间 = 排队时间 + 自己的打水时间 总打水时间=(一个人需要的打水时间)总打水时间 = \sum(一个人需要的打水时间)

      下面是我的代码:

      #include <stdio.h>
      #include <stdlib.h>
      
      int compare(const void *a, const void *b) {
      	return (*(int *)a - *(int *)b);
      }
      
      
      int main() {
      	int n, m;
      	scanf("%d %d", &n, &m);
      	int need_time[55] = {0};
      	
      	for (int i = 0; i < n; i ++) {
      		scanf("%d", &need_time[i]);
      	}
      	qsort(need_time, n, sizeof(int), compare);
      	
      	if (n > m) {
      		for (int i = m; i < n; i ++) {
      			need_time[i] += need_time[i - m];
      		}
      	}
      	
      	int total_time = 0;
      	for (int i = 0; i < n; i ++) {
      		total_time += need_time[i];
      	}
      	
      	printf("%d", total_time);
      	
      	return 0;
      }
      
      • 0
        @ 2025-9-30 16:15:58

        显然应该是让快的人先打水以达到总时间最短的目的。

        #include<stdio.h>
        #include<string.h>
        #include<stdlib.h>
        
        int cmp(const void*a,const void*b){
        	return(*(int*)a-*(int*)b);
        	
        }
        
        int main(){
        	int n,m,i,j;
        	int duan;
        	int zong=0; 
        	scanf("%d %d",&n,&m);
        	int shijian[n];
        	int slt[m];
        	memset(shijian,0,sizeof(shijian));
        	memset(slt,0,sizeof(slt));
        	
        	for(i=0;i<n;i++){
        		scanf("%d",&shijian[i]);
        	}
        	
        	qsort(shijian,n,sizeof(int),cmp); 
        
        	for(i=0;i<n;i++){
        		duan=0;
        		for(j=0;j<m;j++){
        			if(slt[j]<slt[duan]){
        				duan=j;
        			}
        		}
        		zong+=slt[duan]+shijian[i];
        		slt[duan]+=shijian[i];
        	}
        	printf("%d",zong);
        	
        	return 0;
        }
        
        • 1

        信息

        ID
        18
        时间
        1000ms
        内存
        512MiB
        难度
        6
        标签
        递交数
        1108
        已通过
        373
        上传者