问题 A: 多处最优服务次序问题
题目描述
设有 nnn 个顾客同时等待一项服务。顾客 iii 需要的服务时间为 tit_iti,1≤i≤n1 \le i \le n1≤i≤n。共有 sss 处可以提供此项服务。应如何安排 nnn 个顾客的服务次序才能使平均时间达到最小?平均时间是 nnn 个顾客等待服务时间加服务时间的总和除以 nnn。
对于给定的 nnn 个顾客需要的服务时间和 sss 的值,计算最优服务次序。
输入
输入数据的第一行有 222 个正整数 nnn (n≤10000)(n \le 10000)(n≤10000) 和 sss (s≤1000)(s \le 1000)(s≤1000),表示有 nnn 个顾客且有 sss 处可以提供顾客需要的服务。接下来的 111 行中,有 nnn 个正整数,表示 nnn 个顾客需要的服务时间。
输出
输出数据只有一个整数(计算结果四舍五入),表示计算出的最小平均时间。
输入输出样例
样例输入 #1
复制
10 2
56 12 1 99 1000 234 33 55 99 812
样例输出 #1
复制
336
问题 B: 区间相交问题
题目描述
给定 xxx 轴上 nnn 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。 给定 nnn 个闭区间,计算去掉的最少闭区间数。
输入
输入数据的第一行是正整数 nnn (n≤100)(n \le 100)(n≤100),表示闭区间数。接下来的 nnn 行中,每行有 222 个整数,分别表示闭区间的 222 个数端点。
输出
将计算出的去掉的最少闭区间数输出。
输入输出样例
样例输入 #1
复制
3
10 20
10 15
20 15
样例输出 #1
复制
2
提示
数据保证区间长度至少为1
搬宝藏
cpp
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define int long long
using namespace std;
signed main()
{
int n;
cin >> n;
int sum = 0;
int ans = 0;
priority_queue<int,vector<int>,greater<int>>pq;
for (int i = 0;i < n;i++)
{
int x;
cin >> x;
pq.push(x);
}
while (pq.size() > 1)
{
int t1 = pq.top();
pq.pop();
int t2 = pq.top();
pq.pop();
sum = t1 + t2;
ans += sum;
pq.push(sum);
}
cout << ans;
return 0;
}