原题传送门

题目部分:(来自于考试题面,经整理)

【题目描述】

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

1.圆规,每个 7 元。

2.笔,每支 4 元。

3.笔记本,每本 3 元。

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

1.n 元钱必须正好用光,即 \(7a+4b+3c=n\)。

2.在满足以上条件情况下,成套的数量尽可能大,即 \(a,b,c\) 中的最小值尽可能大。

3.在满足以上条件情况下,物品的总数尽可能大,即 \(a+b+c\) 尽可能大。

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

【输入格式】

从文件 order.in 中读入数据。

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

【输出格式】

输出到文件 order.out 中。

若方案不存在则输出 -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

--------------------------------------------------以下为题解部分------------------------------------------

前言:

这个题比较水,况且我们可以看出:数据范围很小,仅仅到了\(10^5\),

这样的复杂度可以暴力

关键是,你若直接暴力\(O(n^3)\),显然会TLE,当下最关键的问题就是如何进行巧妙地暴力

分析:

这里我们简单分析:目标既然是暴力,那就要尽可能的在题目的每一个约束条件上优化,以求得最好效果

第一个条件:n 元钱必须正好用光,即 \(7a+4b+3c=n\)。

显然这里没什么好优化的,这是为了找到答案中的if判断条件,看下一条

第二条,在满足以上条件情况下,成套的数量尽可能大,即 \(a,b,c\) 中的最小值尽可能大。

很难想?那我们就把他们捆起来,当起1套买。

什么意思呢?

系数之和为7+3+4=14,我们就枚举最多能买的套数

显然,一套的值不会超过\(n/14\),如果不行,就减一,看这一种行不行,依次类推

那我们就可以得到第一条循环:

for(int i=n/14;i>=0;i--)\\枚举套数

显然这里我们就已经优化了很多,接着我们继续看条件3

条件3:在满足以上条件情况下,物品的总数尽可能大,即 \(a+b+c\) 尽可能大。

这里就考虑到一个最值问题:

在总钱数一定的情况下,我们买哪个是最划算的(即得到的数量最多)。

这非常的简单,既然是求数量,哪个便宜就买哪个呗。。。。。。

所以,我们尽量多买c

注:这里的c值的max在\(n/3\),b值max在\(n/4\),原因大了的你也买不到啊。。。。。。

第二、三条循环应运而生:

for(int j=i;j<=n/4;j++){    //枚举b
for(int l=i;l<=n/3;l++){ //枚举c

接着你就会写出这个:

#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
scanf("%d",&n);
for(int i=n/14;i>=0;i--){
for(int j=i;j<=n/4;j++){
for(int l=i;l<=n/3;l++){
if(i*7+j*4+l*3==n){
printf("%d %d %d",i,j,l);
return 0;
}
}
}
}
printf("-1");
return 0;
}

然后,恭喜你,成功就变成了这个样子:



注:来源于洛谷

这就是坑人之处,看到这个了吗:



注:来源于洛谷

这里一定一定不要忘记特判n==0的情况

\(Code\)

#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
scanf("%d",&n);
if(n==0){
cout<<"0 0 0"<<endl;
return 0;
}
for(int i=n/14;i>=0;i--){
for(int j=i;j<=n/4;j++){
for(int l=i;l<=n/3;l++){
if(i*7+j*4+l*3==n){
printf("%d %d %d",i,j,l);
return 0;
}
}
}
}
printf("-1");
return 0;
}

----------------------------------------------------THE END-------------------------------------

[NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解的更多相关文章

  1. NOI Online 2021 入门组 T1

    Description 题目描述 Alice.Bob 和 Cindy 三个好朋友得到了一个圆形蛋糕,他们打算分享这个蛋糕. 三个人的需求量分别为 \(a, b, c\),现在请你帮他们切蛋糕,规则如下 ...

  2. P6474 [NOI Online #2 入门组] 荆轲刺秦王

    P6474 [NOI Online #2 入门组] 荆轲刺秦王 bfs+差分+卡常 本来我其实是场内选手,但是因为记错提交时间,晚了半小时才交,交不上了,就自动降级为了场外选手 题面复杂,不简述了 首 ...

  3. P7473 [NOI Online 2021 入门组] 重力球

    P7473 [NOI Online 2021 入门组] 重力球 题意 给你一个正方形平面,某些位置有障碍,对于平面上两个球,每次你可以改变重力方向使两个球下落到最底端,求使两个球位置重合的最小改变重力 ...

  4. 【NOI Online 2020】入门组 总结&&反思

    前言: 这次的NOI Online 2020 入门组我真的无力吐槽CCF的网站了,放段自己写的diss的文章,供一乐 如下:(考试后当天晚上有感而发) 今天是个好日子!!!(我都经历了什么...... ...

  5. 洛谷 P6189 - [NOI Online #1 入门组]跑步(根号分治+背包)

    题面传送门 题意: 求有多少个数列 \(x\) 满足: \(\sum x_i=n\) \(x_i\geq x_{i+1}\) 答案对 \(p\) 取模. ...你确定这叫"入门"组 ...

  6. NOI Online #3 提高组 T1水壶 题解

    题目描述 有 n 个容量无穷大的水壶,它们从 1∼n 编号,初始时 i 号水壶中装有 Ai 单位的水. 你可以进行不超过 k 次操作,每次操作需要选择一个满足 1≤x≤n−1 的编号 x,然后把 x ...

  7. NOI Online #1 入门组 魔法

    全网都是矩阵快速幂,我只会倍增DP 其实这题与 AcWing 345. 牛站 还是比较像的,那题可以矩阵快速幂 / 倍增,这题也行. 先 \(Floyd\) 预处理两点之间不用魔法最短距离 \(d_{ ...

  8. [题解] [NOI Online 2021 入门组 T3] 重力球

    题目大意 在一个 \(n\times n\) 的矩形中,题目会给出 \(m\) 个障碍物.有两个小球,你可以选定四个方向(上下左右)的其中一个,小球会朝着这四个方向一直滚动,直到遇到障碍物或是矩形的边 ...

  9. P6189 [NOI Online #1 入门组] 跑步 (DP/根号分治)

    (才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include < ...

随机推荐

  1. pyecharts的使用及总结

    包的下载及配置 这个包的相应的配置较多,版本也不兼容,总结一下 预览:pyecharts画图 pip pyecharts pip 各级别地图(6.7个左右) pip jupyter环境 [为了生成pn ...

  2. go 中的WaitGroup

    wait_group sync.WaitGroup 类型是并发安全的,也是开箱就能用的. 该类型有三个指针方法,即:Add,Done和Wait. sync.WaitGroup是一个结构体类型.其中一个 ...

  3. ******Prometheus(二)***********

    Prometheus的数据与安全模型: (1)Metric (度量)名字就是描述采集数据的名称——例如,website_visits_total 作为网站访问总数.名称可以包含ASCII字母.数字.下 ...

  4. FJUT2019暑假第二次周赛题解

    A 服务器维护 题目大意: 给出时间段[S,E],这段时间需要人维护服务器,给出n个小时间段[ai,bi],代表每个人会维护的时间段,每个人维护这段时间有一个花费,现在问题就是维护服务器[S,E]这段 ...

  5. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  6. L13过拟合欠拟合及其解决方案

    过拟合.欠拟合及其解决方案 过拟合.欠拟合的概念 权重衰减 丢弃法 模型选择.过拟合和欠拟合 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(g ...

  7. 最后の冲刺 for Alpha release 12/15/2015

    好开心啊,又吃成长快乐了~ 据说release前一天,团队的工作效率会达到顶峰.亲证无效!!! release当天才是团队智力效力能力的巅峰好不好?!因为,今天,plan B:福昕pdf reader ...

  8. .NET Core 发布时去掉多余的语言包文件夹

    用 .NET Core 3.x 作为目标框架时发布完之后,会发现多了很多语言包文件夹,类似于: 有时候,不想要生成这些语言包文件夹,需要稍微配置一下. 在 PropertyGroup 节点中添加如下的 ...

  9. PHP代码审计理解(一)----Metinfo5.0变量覆盖

    0x01 漏洞简介 这个漏洞是metinfo5.0变量覆盖漏洞,并且需要结合文件包含.我使用的cms版本是5.3,事实上已经修复了这个漏洞(5.0的cms源码已经找不到了哈),但是我们可以借他来学习理 ...

  10. python3-邮件发送-不同格式

    0x00 邮件格式 要发邮件,总要先了解邮件格式吧,这里指的是邮件的各个部分与python中SMTP所对应的一些必须的格式 0x01 简单发送邮件格式如下: import smtplib from e ...