zltzlt 发表于 2020-3-9 17:36:19

文具订购

本帖最后由 zltzlt 于 2020-3-9 17:37 编辑

文具订购

题目描述

小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品:


[*]圆规,每个 7 元。
[*]笔,每支 4 元。
[*]笔记本,每本 3 元。


小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 a,b,c,他订购的原则依次如下:


[*]n 元钱必须正好用光,即 7a+4b+3c=n。
[*]在满足以上条件情况下,成套的数量尽可能大,即 a,b,c 中的最小值尽可能大。
[*]在满足以上条件情况下,物品的总数尽可能大,即 a+b+c 尽可能大。


请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案唯一。

输入格式

仅一行一个整数 n 表示班费数量。

输出格式

若方案不存在则输出 -1。否则输出一行三个用空格分隔的非负整数 a,b,c 表示答案。

样例 1 输入

1

样例 1 输出

-1

样例 2 输入

14

样例 2 输出

1 1 1

样例 3 输入

33

样例 3 输出

1 2 6

样例 3 解释

a=2,b=4,c=1 也是满足条件 1,2 的方案,但对于条件 3,该方案只买了 7 个物品,不如 a=1,b=2,c=6 的方案。

数据范围与提示

对于测试点 1 ~ 6:n ≤ 14。
对于测试点 7 ~ 12:n 是 14 的倍数。
对于测试点 13 ~ 18:n ≤ 100。
对于所有测试点:0 ≤ n ≤ 105。

时间限制

1.0s

空间限制

256MB

我的解答

有 Bug 请大家指出,谢谢!

#include <iostream>
using namespace std;

int main()
{
    int n, a, ar = {}, i, j, k, id = 0, a_min = {}, min, am = {}, sidx = 0, sum;
    cin >> n;

    if (!(n % 14))
    {
      a = n / 14;
      cout << a << " " << a << " " << a;
      return 0;
    }
    if (!(n % 7))
    {
      a = n / 14 + 1;
      cout << (a - 1) << " " << a << " " << a;
      return 0;
    }
    if (!n)
    {
      cout << "0 0 0";
      return 0;
    }

    for (i = 0; i < 16; i++)         // a
      for (j = 0; j < 22; j++)   // b
            for (k = 0; k < 36; k++) // c
            {
                if ((i * 7 + j * 4 + k * 3) == n)
                {
                  ar = i;
                  ar = j;
                  ar = k;
                  id++;
                }
            }
    k = 1;

    // 最小值
    for (i = 0; i < id; i++)
    {
      min = (ar < ar) ? ar : ar;
      a_min = ((min < ar) ? min : ar);
    }

    // 最小值最大
    min = a_min;
    am = ar;
    am = ar;
    am = ar;
    for (i = 1; i < id; i++)
    {
      if (a_min > min)
      {
            min = a_min;
            for (j = 0; j < 1000; j++)
            {
                if (am || am || am) // 不全是 0
                {
                  am = 0;
                  am = 0;
                  am = 0;
                }
                else // 全是 0
                  break;
            }
            k = 1;
            am = ar;
            am = ar;
            am = ar;
      }
      else if (a_min == min)
      {
            am = ar;
            am = ar;
            am = ar;
            k++;
      }
    }

    // 处理总和
    if (k == 1)
    {
      if (!(am || am || am)) // 无解
            cout << -1;
      else
            cout << am << " " << am << " " << am;
    }
    else
    {
      sum = am + am + am;

      for (i = 1; i < k; i++)
            if ((am + am + am) > sum)
            {
                sum = am + am + am;
                sidx = i;
            }

      if (!(am || am || am)) // 无解
            cout << -1;
      else
            cout << am << " " << am << " " << am;
    }

    return 0;
}

一个账号 发表于 2021-1-5 22:56:48

我竟然把 “刷题记录” 看成 “刷屏记录” 了。。。。
页: [1]
查看完整版本: 文具订购