题干
鲁大师和他的朋友经常去一家奇怪的餐厅,为什么说奇怪呢,一是餐厅提供的菜品比较奇怪,二是餐厅的付费规则比较奇怪,每个人有不同的折扣上限(单人从总结里折算的最高金额),超过折扣上限的部分原价付费(N个人可以每人出一部分),这次鲁大师和魏然层风以及朋友一共N个人去这家餐厅吃饭,他们点的菜品总金额为T,现在告诉你每个人的折扣率z和折扣上限H,请告诉他们最少需要支付多少钱?
C++实现
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
using namespace std;
//定义结构体保存折扣率和折扣上限
struct person
{
double discount = 1;
int toplimit = 0;
};
//定义结构体排序规则,按照折扣率低的排序
bool cmp(person a, person b)
{
return a.discount < b.discount;
}
int main()
{
int n, t;
while (cin >> n >> t)
{
vector<person> v;
int res = 0;
for (int i = 0; i < n; i++)
{
person p;
cin >> p.discount >> p.toplimit;
v.push_back(p);
}
sort(v.begin(), v.end(), cmp); //结构体排序
for (int i = 0; i < v.size(); i++)
{
if (t <= v[i].toplimit) //若当前费用比当前折扣上限低
{ //当前费用使用该折扣
res += t * v[i].discount;
break;
}
else
{
res += (v[i].toplimit * v[i].discount);//若当前费用比当前折扣上限高
t -= v[i].toplimit; //当前折扣上限使用该折扣
if (i == (int)v.size() - 1) //若所有人的折扣花完,仍然不能cover费用
{ //缴纳剩余原价的费用
res += t;
}
}
}
cout << res << endl;
}
return 0;
}