鱼C论坛

 找回密码
 立即注册
查看: 1619|回复: 2

[技术交流] 文具订购

[复制链接]
发表于 2020-3-9 17:36:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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 输出

  1. -1
复制代码


样例 2 输入

  1. 14
复制代码


样例 2 输出

  1. 1 1 1
复制代码


样例 3 输入

  1. 33
复制代码


样例 3 输出

  1. 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 请大家指出,谢谢!

  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.     int n, a, ar[1000][3] = {}, i, j, k, id = 0, a_min[1000] = {}, min, am[1000][3] = {}, sidx = 0, sum;
  6.     cin >> n;

  7.     if (!(n % 14))
  8.     {
  9.         a = n / 14;
  10.         cout << a << " " << a << " " << a;
  11.         return 0;
  12.     }
  13.     if (!(n % 7))
  14.     {
  15.         a = n / 14 + 1;
  16.         cout << (a - 1) << " " << a << " " << a;
  17.         return 0;
  18.     }
  19.     if (!n)
  20.     {
  21.         cout << "0 0 0";
  22.         return 0;
  23.     }

  24.     for (i = 0; i < 16; i++)         // a
  25.         for (j = 0; j < 22; j++)     // b
  26.             for (k = 0; k < 36; k++) // c
  27.             {
  28.                 if ((i * 7 + j * 4 + k * 3) == n)
  29.                 {
  30.                     ar[id][0] = i;
  31.                     ar[id][1] = j;
  32.                     ar[id][2] = k;
  33.                     id++;
  34.                 }
  35.             }
  36.     k = 1;

  37.     // 最小值
  38.     for (i = 0; i < id; i++)
  39.     {
  40.         min = (ar[i][0] < ar[i][1]) ? ar[i][0] : ar[i][1];
  41.         a_min[i] = ((min < ar[i][2]) ? min : ar[i][2]);
  42.     }

  43.     // 最小值最大
  44.     min = a_min[0];
  45.     am[0][0] = ar[0][0];
  46.     am[0][1] = ar[0][1];
  47.     am[0][2] = ar[0][2];
  48.     for (i = 1; i < id; i++)
  49.     {
  50.         if (a_min[i] > min)
  51.         {
  52.             min = a_min[i];
  53.             for (j = 0; j < 1000; j++)
  54.             {
  55.                 if (am[j][0] || am[j][1] || am[j][2]) // 不全是 0
  56.                 {
  57.                     am[j][0] = 0;
  58.                     am[j][1] = 0;
  59.                     am[j][2] = 0;
  60.                 }
  61.                 else // 全是 0
  62.                     break;
  63.             }
  64.             k = 1;
  65.             am[0][0] = ar[i][0];
  66.             am[0][1] = ar[i][1];
  67.             am[0][2] = ar[i][2];
  68.         }
  69.         else if (a_min[i] == min)
  70.         {
  71.             am[k][0] = ar[i][0];
  72.             am[k][1] = ar[i][1];
  73.             am[k][2] = ar[i][2];
  74.             k++;
  75.         }
  76.     }

  77.     // 处理总和
  78.     if (k == 1)
  79.     {
  80.         if (!(am[0][0] || am[0][1] || am[0][2])) // 无解
  81.             cout << -1;
  82.         else
  83.             cout << am[0][0] << " " << am[0][1] << " " << am[0][2];
  84.     }
  85.     else
  86.     {
  87.         sum = am[0][0] + am[0][1] + am[0][2];

  88.         for (i = 1; i < k; i++)
  89.             if ((am[i][0] + am[i][1] + am[i][2]) > sum)
  90.             {
  91.                 sum = am[i][0] + am[i][1] + am[i][2];
  92.                 sidx = i;
  93.             }

  94.         if (!(am[sidx][0] || am[sidx][1] || am[sidx][2])) // 无解
  95.             cout << -1;
  96.         else
  97.             cout << am[sidx][0] << " " << am[sidx][1] << " " << am[sidx][2];
  98.     }

  99.     return 0;
  100. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-5 22:56:48 | 显示全部楼层
我竟然把 “刷题记录” 看成 “刷屏记录” 了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表