420 [NOI Online 入门组] 文具订购(本站数据)

题目描述

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

圆规,每个 元。

笔,每支 元。

笔记本,每本 元。

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

元钱必须正好用光,即

在满足以上条件情况下,成套的数量尽可能大,即 中的最小值尽可能大。

在满足以上条件情况下,物品的总数尽可能大,即 尽可能大。

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

输入格式

输入仅一行一个整数,代表班费数量

输出格式

如果问题无解,请输出

否则输出一行三个用空格隔开的整数 分别代表圆规、笔、笔记本的个数。

样例

输入 #1

1
输出 #1

-1
输入 #2

14
输出 #2

1 1 1
输入 #3

33
输出 #3

1 2 6
数据范围与提示

样例输入输出 3 解释

也是满足条件 的方案,但对于条件 ,该方案只买了 个物品,不如 的方案。

数据规模与约定

对于测试点 ,保证

对于测试点 ,保证 的倍数。

对于测试点 ,保证

对于全部的测试点,保证

分类标签

[2020] [NOIp 普及组]

C++题解代码

#include <bits/stdc++.h>
using namespace std;

int n;
int a;
int f;
int b;
int c;
int d;
int e;
int g;
int s1;
int s2;
int s3;


int fn(int x, int y, int z) {
  if ((x < y) && (x < z)) {
    return x;
  } else if (y < z) {
    return y;
  } else {
    return z;
  }
}

// The main procedure
int main() {
  cin>>n;
  c = 0;
  d = 0;
  s1 = (-1);
  for (int i = 0; i <= (n/7); i++) {
    a = (n-(i*7));
    for (int j = 0; j <= (a/4); j++) {
      b = (a-(j*4));
      if ((b%3) == 0) {
        b = (b/3);
        f = fn(i, j, b);
        if (f > c) {
          c = f;
          s1 = i;
          s2 = j;
          s3 = b;
          d = (i+(j+b));
        } else if (f == c) {
          g = (i+(j+b));
          if (g > d) {
            d = g;
            s1 = i;
            s2 = j;
            s3 = b;
          }
        }
      }
    }
  }
  if (s1 == (-1)) {
    cout<<"-1";
  } else {
    cout<<s1;
    cout<<" ";
    cout<<s2;
    cout<<" ";
    cout<<s3;
  }
  return 0;
}

Blockly题解代码图片