|洛谷|动态规划|P2690 接苹果

https://www.luogu.org/problem/show?pid=2690

比较简单的DP,但我还是交了3次才AC,能力仍然不足啊

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ms(i,j) memset(i,j, sizeof i);
/*	NOIP2016倒计时,RP++ 
	Luogu: P2690 接苹果
	设f[i][j]为前i个苹果移动j次的最大摘取苹果数
*/
using namespace std; 
int f[1005][35];
int T,K; 
int a;
int main()
{
	scanf("%d%d", &T, &K);
	scanf("%d", &a);
	ms(f,0);
	for (int i=0;i<=K;i++)
	if (a==1)
		if (i%2) f[1][i] = 0; else f[1][i] = 1;//运动了i次,如果是奇数次,那么接不到这个苹果	
	else 
	if (a==2)
		if (i%2) f[1][i] = 1; else f[1][i] = 0;
	for (int i=2;i<=T;i++)
	{
		scanf("%d", &a);
		for (int j=0;j<=K;j++)
		{
			for (int k=0;k<=j;k++)
			{
				int add = 0;
				if (k==0||!(k%2))
				{	if (a==1) add = 1;}
				else
				{	if (a==2) add = 1;}
				f[i][j] = max(f[i][j], f[i-1][k]+add);
				if (k-1>=0) f[i][j] = max(f[i][j], f[i-1][k-1]+1);
			}
		}
	}
	printf("%d\n", f[T][K]);
    return 0;
}


<think>嗯,用户想要寻找关于信息学奥赛中map知识点的课程设计资料,包括示例和教程。首先,我需要回顾一下map数据结构的基本概念和应用场景。根据引用[3],std::map是一个关联容器,用键值对存储数据,键唯一,通常用红黑树实现,操作时间复杂度是O(log n)。这可能是在课程设计中需要强调的基础知识。 下来,用户可能需要具体的课程设计结构。我应该考虑如何分模块来组织内容,比如基础概念、常用操作、应用案例、练习题等。引用[3]中的示例代码展示了map的声明、插入和访问,这些可以作为课程设计的示例部分。此外,用户可能需要实际的应用案例,比如统计词频或学号管理,这些例子能帮助学生理解map的实际用途。 另外,用户可能希望课程设计包含实践环节,比如实验任务和项目实战。例如,设计一个学生成绩管理系统,使用map来存储学生信息,这样可以综合应用插入、删除、查询等操作。同时,结合引用[2]中提到的栈结构,或许可以设计一个综合性的题目,结合不同数据结构解决问题,但用户当前的问题集中在map上,可能需要专注于相关案例。 还需要注意课程设计中的常见问题,比如键的唯一性和类型选择,这些是学生在使用map时容易出错的地方。引用[3]中提到的数据类型溢出问题可能也需要提醒,特别是在处理大数或特殊键类型时。 最后,用户可能需要扩展学习资源,比如推荐书籍或在线教程,帮助他们深入学习。结合引用[1]中的建议,使用英文注释代码或阅读英文题解,可以建议学生多实践,提升理解和应用能力。</think># 信息学奥赛 map 数据结构 课程设计示例 ### 一、课程设计目标 1. 掌握`std::map`的基本特性与底层原理 2. 熟练应用键值对存储模式解决实际问题 3. 理解红黑树实现带来的$O(\log n)$时间复杂度特性[^3] ### 二、课程模块设计 #### 模块1:基础认知(2课时) - **核心概念**:关联容器、键值对、自动排序 - **代码演示**: ```cpp #include <iostream> #include <map> using namespace std; int main() { map<string, int> fruitPrice; fruitPrice["apple"] = 5; fruitPrice["banana"] = 3; cout << "苹果价格:" << fruitPrice["apple"] << endl; return 0; } ``` #### 模块2:常用操作(3课时) 1. **插入操作**: - `insert(pair<type1, type2>(key, value))` - `emplace(key, value)` 2. **查找操作**: - `find(key)`返回迭代器 - `count(key)`返回存在数量(0/1) 3. **遍历方法**: ```cpp for(auto it=mp.begin(); it!=mp.end(); ++it) { cout << it->first << ":" << it->second << endl; } ``` #### 模块3:应用案例(4课时) **案例1:词频统计** ```cpp map<string, int> wordCount; string text = "apple banana apple orange"; // 分割字符串存入map(此处省略分词代码) ``` **案例2:学号管理系统** 实现根据姓名快速查找学号(如引用[3]中的示例) **案例3:成绩排名系统** ```cpp map<int, string, greater<int>> scoreRank; // 按分数降序排列 scoreRank[95] = "张三"; scoreRank[88] = "李四"; ``` #### 模块4:进阶对比(2课时) | 特性 | map | unordered_map | |---------------|--------------|---------------| | 实现结构 | 红黑树 | 哈希表 | | 遍历顺序 | 按键排序 | 无序 | | 查找速度 | $O(\log n)$ | $O(1)$ | ### 三、实验任务设计 1. **基础实验**:实现电话簿查询系统 - 需求:支持姓名查号码/号码查姓名(需两个map) - 输入示例: ``` 添加 张三 13800138000 查询 张三 ``` 2. **综合实验**:自动阅卷系统 - 使用map存储<题号, 正确答案> - 实现自动比对和分数计算 ### 四、课程资源 1. **推荐教材章节**: - 《算法竞赛入门经典》第5章STL部分 - 《C++ Primer》第11章关联容器 2. **OJ练习题推荐**: - 洛谷P1102 统计单词出现次数 - Codeforces 702B 找满足条件的数对 ### 五、常见问题集 1. **键重复问题**:尝试插入已存在的键时,`insert`不会覆盖原有值,而`[]`运算符会直覆盖 2. **类型选择**:当需要保持插入顺序时,应选择`vector<pair<>>`而非map 3. **性能陷阱**:频繁插入删除时,红黑树的旋转操作可能带来额外开销 ### 六、课程评估方式 1. 课堂编码测试(40%) 2. 实验项目验收(40%) 3. 理论知识点考核(20%)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值