利用pair解决简单的付费问题
题目描述:有家奇怪的餐厅,为什么说奇怪呢?一是餐厅提供的菜品比较奇怪,二是付费的规则比较奇怪,每个人有不同的折扣上限(单人从总结里折算最高金额),超过折扣上限的部分原价付费(N个人每个人可以出一部分),有一天N个人去这家餐馆吃饭,总金额为T,现在告诉每个人的折扣率z和折扣上限H,请你告诉他们最少需要支付多少钱?
输入格式:
输入数据有多组,每组占N+1行,第一行是N和T,每行两个数字z和H(0<H<100)。
输出格式:
对于每组输入数据,输出一行,对应一个要求的答案(向下取整)。
测试案例:
输入: 输出:
2 100 65
0.7 70
0.6 50
3 500 390
0.6 100
0.8 200
0.7 100
1 100 60
0.6 100
为了快速解决,并没有使用结构体。
以下为代码,重要注释存在于代码段中。
#include<iostream>
#include<algorithm>
using namespace std;
bool comp(pair<float, int> A, pair<float, int> B)
{
if (A.first < B.first)return true;
return false;
}
int main()
{
int N, T,H,min=1,sum=0,temp_int;
float z;
pair<float,int> W[100], temp_pair;
cin >> N >> T;
for (int i = 0; i < N; i++)
{
cin >> z >> H;
temp_pair = pair<float, int>(z, H);
W[i] = temp_pair;
}
//对折扣进行排序,产生新的集合
sort(W, W+N,comp);
for (int i = 0; i <N; i++)
{
//如果价格低于某人折扣所能扣的钱
if (T <= W[i].second)
{
//就将此人的折扣扣除,
sum += T * W[i].first;
break;
}
//若当前费用比当前折扣上限高
else
{
sum += (W[i].second*W[i].first);
T -= W[i].second;//当前折扣上使用该折扣
if (i == N - 1)//若所有人的折扣花完,任然不能结算,则缴纳剩余的钱
{
sum += T;
}
}
}
cout << sum << endl;
return 0;
}