[蓝桥杯][算法提高VIP]排队打水问题(贪心)

题目描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2…………tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

数据规模和约定
其中80%的数据保证n< =10

输入
第一行n,r (n< =500,r< =75)
第二行为n个人打水所用的时间Ti (Ti< =100);
输出
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7
思路:这个问题,求的是最少花费的时间,等于接水的时间+等待的时间。接水的时间是固定的,我们要求最少的花费时间,只需要最小化等待时间就可以了,这样就变化为上一篇博客的题目打水问题
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=1e3+100;
int a[maxx];
vector<int> p[maxx];
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	ll Sum=0;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),Sum+=a[i];
	sort(a+1,a+1+n);
	int tx=0;
	for(int i=1;i<=n;i++)
	{
		p[tx].push_back(a[i]);
		tx=(tx+1)%m;
	}
	ll ans=0;
	for(int i=0;i<m;i++)
	{
		if(p[i].size())
		{
			ll sum=0;
			for(int j=0;j<p[i].size()-1;j++)
			{
				sum+=p[i][j];
				ans+=sum;
			}
		}
	}
	cout<<ans+Sum<<endl;
	return 0;
}

简单一变就变成了另外一道题目。
努力加油a啊,(o)/~

发布了529 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/starlet_kiss/article/details/104902497