7 solutions

  • 1
    @ 2022-2-14 18:20:02
    //贪心算法,局部最优
    #include<stdio.h>
    int array[100001];
    void quicksort(int left,int right){
    	if(left > right)
    	  return;
    	int i,j,t;
    	i = left;//左边哨兵 
    	j = right;//右边哨兵 
    	int temp = array[left];//设置基位 
    	while(i!=j){//当左右不相等的时候进行遍历
    	    while(array[j] >= temp && i < j)
    		j--;
    	    while(array[i] <= temp && i < j)
    		i++; 
    		if(i<j){
    			t = array[i];
    			array[i] = array[j];
    			array[j] = t;
    		}
    	}
    	array[left] = array[i];
    	array[i] = temp;
    	quicksort(left,i-1);
    	quicksort(i+1,right);
    	return;
    }
    int main(){
    	int n;
    	long long sum = 0;
    	scanf("%d",&n);
    	for(int i=0; i<n; i++){
    		scanf("%d",&array[i]);
    	}    
    	quicksort(0,n-1);
        for(int i=0; i<n; i++){
        	sum += array[i]*(n-i-1);
    	}
    	printf("%lld\n",sum);
    } 
    
    • 1
      @ 2021-10-18 0:54:01

      题解

      这个题很好理解吧,题目上说第 i 个人装满水桶所需的时间是 t_i,花时间短的排在前面就行。

      代码

      #include<bits/stdc++.h>  
      using namespace std;
      int t[100010];
      int main()
      {
      	int n;
      	std::ios::sync_with_stdio(false);
      	cin>>n;
      	for(int i=0;i<n;i++) cin>>t[i];
      	sort(t,t+n);
      	long long sum=0;
      	for(int i=0;i<n;i++) sum+=t[i]*(n-i-1);
      	cout<<sum<<endl;
      	return 0;
      }
      
      • @ 2022-4-3 19:04:31

        我靠,大佬 绝对是那种 思考完问题 才去写代码的 细人。确实 如果我再 多考虑一下,多想一下的话,这道题 就可以 像你这样理解了。

        第一个 人 如果 打水 一分钟,其实 后面的 人 就都要 多等待一分钟,那么 问题 就真的 很好解决了。

        大佬!

    • 0
      @ 2021-10-17 23:53:46

      排序所有人打水时间,让短的先打,就节约时间,可以自己写例子试

      上代码

      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
      	int n,a[100005]={0};
      	long long sum=0,s=0;
      	scanf("%d",&n);
      	for(int i=0;i<n;i++)scanf("%d",&a[i]);
      	sort(a,a+n);
      	for(int i=0;i<n-1;i++)
      	{
      		s+=a[i];
      		sum+=s;
      	}
      	printf("%lld",sum);
      	return 0;
      }
      
      • 0
        @ 2021-10-17 21:42:07

        P1072. 排队打水

        题意概述

        不同的人有不同的打水时间,根据他们的打水时间,用一个最优方案使得所有人的等候时间最短

        题意分析

        为了尽快让大家的等待时间较少,就应该把打水时间较短的放到最前面(严重怀疑这是一个排序题,或者说就是排序题),我们对打水时长做一个升序排序,然后依次计算每个人的等待时间最后累加即可。

        可行代码

        #include <algorithm>
        #include <iostream>
        using namespace std;
        typedef long long ll;
        int main() {
            ll all;
            cin >> all;
            ll time[all];
            for (ll i = 0; i < all; i++)
                cin >> time[i];
            sort(time, time + all);
            ll sum = 0;
            for(ll i = 0; i < all; i++){
                sum += time[i] * (all - i - 1);
            }
            cout << sum << endl;
            return 0;
        }
        

        END

        • 0
          @ 2021-10-17 19:32:01

          题解

          思路还是简单,把打水时间从小到大进行排序即可,注意一点,在打水的人本身不算等待的时间,直接上代码:

          代码

          #include<bits/stdc++.h>
          #include<iostream>
          #include<algorithm>
          #include<iomanip>
          using namespace std;
          int x[100000000],y[17];
          char a[11],b[18];
          struct Main{
          	char a[20];
          	int cheng;
          }pp[300];
          int cmp(Main x,Main y){
          	return x.cheng>y.cheng;
          }
          int main()
          {
          	long long n,m,sum=0;
          	cin>>n;
          	m=n-1;
          	for(long long i=1;i<=n;i++){
          		cin>>x[i];
          	}
          	sort(x+1,x+1+n);
          	for(long long i=1;i<=n;i++){
          		sum+=x[i]*m;
          		m--;
          	} 
          	cout<<sum<<endl;
          	return 0;
          }
          
          • 0
            @ 2021-10-17 16:35:02

            将打水的人按从小到大排序,然后思路就很清晰了 样例:3 6 1 4 2 5 7 1 2 3 4 5 6 7 第一个人0,第二个1,第三个3,第四个6,第五个10,第六个15,第七个21 #include #include using namespace std; long long int n,sum; int s[100005],a[100005]; int main() { cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); for(int i=0;i<n;i++) { sum+=a[i]*(n-i-1); } cout<<sum; return 0; }

            • 0
              @ 2021-10-14 20:28:52

              很清晰的思路 需要从让人等待时间最少的人开始打水,每一轮等待的时间都为这个人打水的时间乘以剩下的人数,最后把时间加起来就行了

              • 1

              Information

              ID
              76
              Time
              1000ms
              Memory
              256MiB
              Difficulty
              6
              Tags
              # Submissions
              256
              Accepted
              81
              Uploaded By