马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 输出
样例 2 输入
样例 2 输出
样例 3 输入
样例 3 输出
样例 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[1000][3] = {}, i, j, k, id = 0, a_min[1000] = {}, min, am[1000][3] = {}, 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[id][0] = i;
ar[id][1] = j;
ar[id][2] = k;
id++;
}
}
k = 1;
// 最小值
for (i = 0; i < id; i++)
{
min = (ar[i][0] < ar[i][1]) ? ar[i][0] : ar[i][1];
a_min[i] = ((min < ar[i][2]) ? min : ar[i][2]);
}
// 最小值最大
min = a_min[0];
am[0][0] = ar[0][0];
am[0][1] = ar[0][1];
am[0][2] = ar[0][2];
for (i = 1; i < id; i++)
{
if (a_min[i] > min)
{
min = a_min[i];
for (j = 0; j < 1000; j++)
{
if (am[j][0] || am[j][1] || am[j][2]) // 不全是 0
{
am[j][0] = 0;
am[j][1] = 0;
am[j][2] = 0;
}
else // 全是 0
break;
}
k = 1;
am[0][0] = ar[i][0];
am[0][1] = ar[i][1];
am[0][2] = ar[i][2];
}
else if (a_min[i] == min)
{
am[k][0] = ar[i][0];
am[k][1] = ar[i][1];
am[k][2] = ar[i][2];
k++;
}
}
// 处理总和
if (k == 1)
{
if (!(am[0][0] || am[0][1] || am[0][2])) // 无解
cout << -1;
else
cout << am[0][0] << " " << am[0][1] << " " << am[0][2];
}
else
{
sum = am[0][0] + am[0][1] + am[0][2];
for (i = 1; i < k; i++)
if ((am[i][0] + am[i][1] + am[i][2]) > sum)
{
sum = am[i][0] + am[i][1] + am[i][2];
sidx = i;
}
if (!(am[sidx][0] || am[sidx][1] || am[sidx][2])) // 无解
cout << -1;
else
cout << am[sidx][0] << " " << am[sidx][1] << " " << am[sidx][2];
}
return 0;
}
|