问题解决策略贪心训练2

问题 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;
}