【每日一题】codeforces 1348D (1900) (贪心)

每日一题,坚持使我强大


今日份快乐:codeforces 1348D 传送门

明天份快乐:codeforces 463C 传送门


题目大意

刚开始有一个细胞,质量为 1。每天白天,可以选择 x 个细胞进行分裂。一个质量为 m 的细胞可以分裂为两个质量为 m / 2 的细胞。每天晚上,所有的细胞质量都会加 1。
问:最短需要多少天,细胞的总质量为 n。不存在就输出 -1。

分析

我们直接结合一个样例来看:
当 n = 80 时,我们先根据贪心的思想,每天都让所有的细胞都分裂。

天数开始123456
当前细胞数112481632
当前需要质量80797773654917
分裂后细胞数0248163264
分裂后需要质量797773654917-47

观察上表,前五天的过程中,每天对所需质量的贡献都是这天时的细胞数。解释一下,比如说第三天时,我们刚开始有 4 个细胞,白天分裂为 8 个细胞,晚上所有细胞都质量加 1 ,则一共增加 8 个单位的质量,所需质量就减少 8 个单位。
但是可以发现,最后一天所需的质量为 17,不是 2 的次幂,不能被正好减去,这就很明显,我们需要在前五天中插入一天,让细胞数增值为 17 ,使得第六天需要的细胞数成为 2 的次幂,被正好消除

天数开始123456
当前细胞数112481617
当前需要质量80797773654932
分裂细胞数01248115
分裂后细胞数0248161732
分裂后需要质量7977736549320

我们在第五天的时候变动一下,让这天只分裂一个细胞,分裂完以后有 17 个细胞,正好为所需质量贡献 17 个单位的质量,第六天需要的质量正好为 32 是 2 的次幂可以被消除。
我们为什么选择在第五天呢?因为 16 < 17 < 32,我们把 16 增值为 32一天的操作,分为 16 到 17 再到 32两天的操作,这样的好处就是用最短的时间得到 17个单位质量的贡献值。这样也正好说明了,这个题不会出现无解的情况,因为无论留下的是多少,都可以被补全。(如果留下质量 n = 0 时,不用补。不为 0 时,一定会有一个 x 满足 2x < n < 2 x+1)。
所以,这个题的思路就是,我们让细胞尽可能的全部分裂,最后不够的质量,再找到一个合适的位置插入,如何实现看代码。

代码

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

int main() {

	ios::sync_with_stdio(false);
	
	int ncase;
	cin >> ncase;
	
	while(ncase--){
		
		int n;
		cin >> n;
		
		vector<int>res;
		for(int i = 1; i <= n; i <<= 1){   	// 不断让所有的细胞分裂,直到所需质量小于当前细胞数
			res.push_back(i);		// res 中纪录的为每天最终的细胞数
			n -= i; 			// 每次分裂对所需质量的贡献都为 i
		}
		if(n > 0){				// 如果所需质量不为 0
			res.push_back(n);		// 把这个质量插入到结果中
			sort(res.begin(), res.end()); 	// 把 n 放到到满足 2^x < n < 2 ^ x+1 的位置
		}
		
		int len = res.size();
		cout << len - 1 << endl;		// 开始的 1 不用算
		for(int i = 1; i < len; i++) cout << res[i] - res[i-1] << " "; // 相邻两天的细胞数的差就是要增值的数量
		cout << endl;
		
	}
	
    return 0;
}

解释的不清楚的地方欢迎留言提出,同时欢迎大佬留言指正错误

<think>好的,我现在要帮用户整理一份学习C++的博客清单,并制定一个规划表,帮助他们从入门到达到NOIP水平。首先,我需要确定用户的需求。用户是刚开始学习C++,目标是通过NOIP竞赛,所以需要覆盖从基础语法到高级算法的内容。 首先,我得分解学习路径。通常NOIP考察的内容包括基本语法、数据结构、算法、以及题目实战。所以博客清单应该分阶段,逐步深入。 第一阶段肯定是基础语法。用户需要了解变量、循环、条件语句、函数、数组这些。然后是STL的使用,比如vector、string、queue、stack等,这些在竞赛中非常常用,能节省很多时间。 接下来是基础算法,比如排序、查找、递归、分治、贪心、简单动态规划。这些是解决NOIP题目的基础,必须扎实。 第三阶段是数据结构进阶,比如链表、树、图、并查集、堆、哈希表。特别是树和图的相关算法,比如遍历、最短路径、最小生成树,这些在竞赛中经常出现。 第四阶段是高级算法,包括动态规划、搜索算法(DFS、BFS、剪枝)、数论、字符串处理(KMP、字典树)、高级图论算法。动态规划在NOIP中占比较大,需要重点讲解。 最后是综合实战,通过模拟题和历年真题来巩固所学知识,熟悉比赛题型和时间管理。 接下来,我需要为每个阶段推荐具体的博客资源。要确保这些资源是中文的、免费且质量较高的。比如C语言中文网、OI Wiki、阮行止的博客、Pecco的算法课等,这些资源比较权威,适合不同阶段的学习。 然后是规划表。用户可能需要一个为期4-5个月的计划,每周安排不同的主题。例如,前两周学习基础语法,接下来两周学习STL,然后逐步深入算法和数据结构。每个月复习和实战测试也很重要,帮助巩固知识。 需要注意用户可能有不同的学习速度,所以规划表要有一定的弹性,建议每天2-3小时的学习时间,保持持续学习。同时,提醒用户多做练习题,参加在线评测平台,如洛谷、Codeforces,这些对提升实战能力很有帮助。 最后,检查是否有遗漏的部分,比如调试技巧、代码优化,或者竞赛中的常见陷阱。确保推荐的博客内容覆盖这些方面,帮助用户全面准备NOIP。</think>我将为您整理一份C++学习路径及配套博客资源清单,并附上详细规划表。以下内容根据NOIP考纲要求设计,分阶段渐进式学习: --- ### 一、分阶段学习博客清单 #### 📚 阶段1:C++语法基础 1. **《C++快速入门指南》**(C语言中文网) - 环境搭建、变量类型、运算符、流程控制、函数 2. **《从零理解面向过程编程》**(菜鸟教程) - 数组、字符串、结构体、指针基础 3. **《C++标准输入输出全解析》**(洛谷日报) - 输入输出优化、流控制、格式处理技巧 #### 🔧 阶段2:STL与基础算法 1. **《STL容器完全指南》**(OI Wiki) - `vector`/`string`/`queue`/`stack`/`map`详解 2. **《十大排序算法动画解析》**(Hello算法) - 冒泡/选择/插入/归并/快排/堆排序对比 3. **《递归与分治实战20例》**(Codeforces教程) - 汉诺塔、斐波那契、快速幂实现 #### 🧠 阶段3:数据结构进阶 1. **《树形结构完全手册》**(AcWing博客) - 二叉树/二叉搜索树/堆/并查集实现 2. **《图论算法三部曲》**(Pecco的算法课) - DFS/BFS/最短路径/最小生成树 3. **《动态规划入门到精通》**(阮行止的博客) - 背包问题、线性DP、状态转移方程设计 #### ⚡ 阶段4:NOIP专项突破 1. **《竞赛数学技巧大全》**(洛谷日报) - 质数筛法、快速幂、模运算、组合数学 2. **《剪枝与优化实战指南》**(OI Wiki) - 记忆化搜索、双向BFS、启发式搜索 3. **《历年NOIP真题精讲》**(信息学奥赛一本通) - 2015-2022年真题解析 --- ### 二、学习规划表(总时长4-5个月) #### 📅 第1-2周:语法筑基 - 每天2小时学习基础语法 - 配套练习:洛谷「新手村」题目 - 重点掌握:循环结构、数组操作、函数编写 #### 📅 第3-4周:STL实战 - 重点练习:`vector`和`sort`的配合使用 - 典型题目:P1177(排序)、P1553(字符串处理) #### 📅 第5-6周:算法入门 - 每日刷3道递归/分治类题目 - 理解时间复杂度的计算方法 #### 📅 第7-8周:数据结构攻坚 - 专项训练:并查集(P1551)、堆(P1090) - 掌握树的前中后序遍历实现 #### 📅 第9-12周:动态规划与图论 - 重点突破:背包九讲、Floyd/Dijkstra算法 - 完成10道经典DP题目(如P1216数字三角形) #### 📅 第13-16周:综合实战 - 每周完成2套NOIP模拟赛 - 分析错题并撰写解题报告 - 学习对拍调试技巧 --- ### 三、关键学习建议 1. **代码实践**:每个知识点必须配合3-5道练习题 2. **调试能力**:学会使用`gdb`或IDE调试工具 3. **复杂度控制**:保证算法能通过$10^5$量级数据 4. **模考策略**:训练每题最多25分钟的解题速度 ### 四、推荐练习平台 - **洛谷**(www.luogu.com.cn) - **AcWing**(www.acwing.com) - **Codeforces**(codeforces.com) 附学习路线图: ```mermaid graph TD A[语法基础] --> B[STL容器] B --> C[排序/查找] C --> D[递归/分治] D --> E[线性数据结构] E --> F[树形结构] F --> G[图论算法] G --> H[动态规划] H --> I[数学基础] I --> J[综合实战] ``` 建议每天保持2-3小时有效学习时间,每周安排半天进行错题复习。遇到难点时,可参考《算法竞赛进阶指南》纸质书辅助学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值