文章

16

粉丝

0

获赞

66

访问

3.5k

头像
奇怪的餐厅 题解:
P1670 中南大学机试题
发布于2025年3月19日 23:21
阅读数 255

首先分析题意,大致意思就是一顿饭一起付但是每个人享受的折扣率和折扣上限不同。让他们支付最少钱有两种情况:①每个人的折扣上限之和小于待付金额,此时每个人都付自己的最大金额(即折扣率*折扣上限),而后将剩下待付的钱与折扣上限之和加起来就是付钱最少的情况。②每个人的折扣上限之和大于待付金额,此时需从折扣率最小的人开始付起。本质是贪心的思想,关键是要理解为什么从折扣率最低的人开始(折扣率低表示打折力度大,花的钱就更少)。代码实现中,将两种情况联合在一起并不冲突,直接把折扣率按升序排,依次付钱直至付清或者每个人都付过为止。

具体代码实现如下:

#include <bits/stdc++.h>
using namespace std;
struct node
{
  float dic;
  int price;
};
int cmp(node a, node b)
{
  return a.dic < b.dic;//实现折扣率的排序
}
int main()
{
  int n, t;
  while (cin >> n >> t)
  {
    node a[n];
    for (int i = 0; i < n; i++)//初始化每个人的折扣率和折扣上限
      cin >> a[i].dic >> a[i].price;
    sort(a, a + n, cmp);//升序排
    int res = t, cost = 0;//res用来表示还剩多少钱没付,cost表示实际所花钱数
    for (int i = 0; i < n; i++)//开始结账,每个人都要结账
    {
      if (res >= a[i].price)//表示下一位付钱的人能否在折扣上限中把钱付完
      {
    &n...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发