思路:模拟即可。
先把所有最小的放入小端队列
剩下的放在数组
然后从头出 入队列的值是队首+这个值。
只是自己写的太乱了 莫名其妙的。。。
#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