蓝桥 - 排队打水问题 模拟

思路:模拟即可。
先把所有最小的放入小端队列
剩下的放在数组
然后从头出 入队列的值是队首+这个值。

只是自己写的太乱了 莫名其妙的。。。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
struct node{
    int t,id;
    bool operator<(const node &oth)const{
        return t>oth.t;
    }
}a[1010];
priority_queue<node> q;//代表水龙头
int main() {
	int n,r;
    sdd(n,r);
    ll sum=0;
    rep(i,1,n){
        sd(a[i].t);
        sum+=a[i].t;
        a[i].id=i;
    };
    sort(a+1,a+n+1);//从大到小排序
    int p=n+1;
    while(q.size()<r&&p>1){
        q.push(a[--p]);
    }
    ll ans=0;
    while(!q.empty()){
        ans+=q.top().t;
        if(p>1){
            node tp;
            tp.t=q.top().t+a[--p].t;
            q.push(tp);
        }
        q.pop();
    }
    printf("%lld\n",ans-sum);

	return 0;
}

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

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

输入
第一行n,r (n< =500,r< =75)
第二行为n个人打水所用的时间Ti (Ti< =100);
输出
最少的花费时间
样例输入

3 2
1 2 3

样例输出

7

发布了120 篇原创文章 · 获赞 12 · 访问量 5265

猜你喜欢

转载自blog.csdn.net/weixin_43735161/article/details/104986542