2015年NOIP普及组复赛题解
题目涉及算法:
- 金币:入门题;
- 扫雷游戏:入门题;
- 求和:简单数学推导;
- 推销员:贪心。
金币
题目链接:https://www.luogu.org/problem/P2669
入门题,直接开一个循环遍历一下就可以了。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
int n, ans = 0;
int main() {
cin >> n;
for (int i = 1; n; i ++) {
int t = min(i, n);
ans += i *t;
n -= t;
}
cout << ans << endl;
return 0;
}
扫雷游戏
题目链接:
基础题,直接遍历一下地图(对于每个格子,统计一下周围8个格子)就可以实现地雷的统计。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int n, m, c[maxn][maxn];
char maze[maxn][maxn];
int dir[8][2] = { -1, -1, -1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 0, 1, 1 };
inline bool in_map(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> maze[i];
for (int i = 0; i < n; i ++) for (int j = 0; j < m; j ++) {
if (maze[i][j] == '*') for (int k = 0; k < 8; k ++) {
int x = i + dir[k][0], y = j + dir[k][1];
if (in_map(x, y)) c[x][y] ++;
}
}
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if (maze[i][j] == '*') putchar('*');
else cout << c[i][j];
}
cout << endl;
}
return 0;
}
求和
题目链接:https://www.luogu.org/problem/P2671
这道题目是一道简单的数学推导。
首先,因为一共有m种颜色,并且我们只有具有相同奇偶性的一对数才能凑成x和z,所以我们将所有从1到n的编号划分进 \(2 \times m\) 个集合,对于编号 \(i\):
- 如果 \(i\) 是奇数,将其归到 \(2 \times color[i]\) 集合中;
- 如果 \(i\) 是偶数,将其归到 \(2 \times color[i] - 1\) 集合中。
然后我们去遍历每一个集合。
如果该集合的元素个数是 \(sz\) ,并且我们设该集合中所有元素数值和 \(S = \sum number[i]\) ,则我们遍历集合中的每个元素 \(x\) ,并将
\((sz-1) \times x \times number[x] + x \times (S - number[x])\)
的结果加进我们的答案中。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;
const long long MOD = 10007;
vector<int> vec[maxn];
int n, m, color[maxn];
long long ans, num[maxn], sum[maxn];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
cin >> num[i];
num[i] %= MOD;
}
for (int i = 1; i <= n; i ++) cin >> color[i];
for (int i = 1; i <= n; i ++) {
int id = (i % 2) ? (color[i] * 2) : (color[i] * 2 - 1);
vec[id].push_back(i);
sum[id] = (sum[id] + num[i]) % MOD;
}
for (int i = 1; i <= 2*m; i ++) {
int sz = vec[i].size();
if (sz <= 1) continue;
for (int j = 0; j < sz; j ++) {
int v = vec[i][j];
long long tmp = (long long)(sz-1) * (long long)v * (long long) num[v] % MOD;
tmp += (long long) v * (sum[i] - num[v] + MOD) % MOD;
ans = (ans + tmp) % MOD;
}
}
cout << ans << endl;
return 0;
}
推销员
题目链接:https://www.luogu.org/problem/P2672
这道题目是贪心,贪心的思想是:
选择 \(m\) 户人家的最大疲劳值应该是以下两种方案中的较大值:
- 方案一:选择 \(a[i]\) 最大的 \(m\) 户人家;
- 方案二:选择 \(a[i]\) 最大的 \(m-1\) 户人家,以及剩下的 \(n-(m-1)\) 户人家中 \(2 \times s[i] + a[i]\) 最大的那户人家
所以,我们可以给 \(n\) 户人家按照 \(a[i]\) 从大到小金星排序。
然后在开三个数组(这3个数组用到了DP来进行求解):
suma[i]:表示 \(\sum_{j=1}^{i}a[j] + 2 \times \max_{j=1}^{i}(s[j])\) ,推导公式:suma[i] = suma[i-1] + a[i]maxs[i]:表示 \(\max_{j=1}^{i} s[j]\) ,推导公式:maxs[i] = maxs[i-1] + s[i]maxsa[i]:表示 \(\max_{j=i}^{n} (2 \times s[j] + a[j])\) ,推导公式:maxsa[i] = max(maxsa[i+1], 2 \times s[i] + a[i])
然后我们要在 \(n\) 户人家里面选择 \(m\) 户人家访问的最大疲劳值就是 sum[m] + 2 * maxs[m] 和 suma[m-1] + 2 * maxs[i] 的较大值。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100100;
int n, s[maxn], a[maxn], idx[maxn], suma[maxn], maxs[maxn], maxsa[maxn];
bool cmp(int i, int j) {
return a[i] > a[j];
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> s[i];
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) idx[i] = i;
sort(idx+1, idx+1+n, cmp);
for (int i = 1; i <= n; i ++)
suma[i] = suma[i-1] + a[idx[i]], maxs[i] = max(maxs[i-1], s[idx[i]]);
for (int i = n; i >= 1; i --)
maxsa[i] = max(maxsa[i+1], s[idx[i]] * 2 + a[idx[i]]);
for (int i = 1; i <= n; i ++)
cout << max(suma[i]+2*maxs[i], suma[i-1]+maxsa[i]) << endl;
return 0;
}
作者:zifeiy
2015年NOIP普及组复赛题解的更多相关文章
- 2010年NOIP普及组复赛题解
题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...
- 2017年NOIP普及组复赛题解
题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...
- 2016年NOIP普及组复赛题解
题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...
- 2014年NOIP普及组复赛题解
题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...
- 2013年NOIP普及组复赛题解
题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...
- 2011年NOIP普及组复赛题解
题目涉及算法: 数字反转:模拟: 统计单词数:模拟: 瑞士轮:模拟/排序: 表达式的值:后缀表达式/DP. 数字反转 题目链接:https://www.luogu.org/problem/P1307 ...
- 2008年NOIP普及组复赛题解
题目涉及算法: ISBN号码:简单字符串模拟: 排座椅:贪心: 传球游戏:动态规划: 立体图:模拟. ISBN号码 题目链接:https://www.luogu.org/problem/P1055 简 ...
- 2005年NOIP普及组复赛题解
题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...
- 2018年NOIP普及组复赛题解
题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...
随机推荐
- Hibernate:**not found while looking for property: id https://blog.csdn.net/weixin_43827144/article/details/88935334
https://blog.csdn.net/weixin_43827144/article/details/88935334 在程序执行时可能会报找不到属性的错误:例如:class Student n ...
- GDOI模拟4.11~4.13总结
总体情况 省选前的第一场模拟,就连续三天垫底滚粗了. 三天下来,只做了第一天的签到题,然后再做了一些水题的暴力,还不得分. 三天分数:100/400+40/400+90/400=230/1200,得了 ...
- Android消息机制使用注意事项,防止泄漏
在Android的线程通信当中,使用频率最多的就是Android的消息处理机制(Handler.send().View.post().Asynctask.excute()等等都使用到了消息处理机制). ...
- CSS:命名规范心得分享
一个好的命名习惯(当然这里指的并不仅仅是CSS命名).不仅可以提高开发效率,而且有益于后期修改和维护. 假设我们当前使用的命名方式都是约定成俗的,所有人都是这样写,那么你去到一个新团队,或者别人来接手 ...
- Gatling初次体验
主要步骤: 1. 利用springboot编写了一个简单的服务jdktest 2.将jdktest利用docker在虚拟机中启动 3.创建一个scala工程,利用gatling提供的DSL编写性能脚本 ...
- qt加载背景图片的一种方式
//加载背景图片 void LCTGrid::loadBgPicture() { QImage image; QPalette palette; image.load(m_sPicturePath); ...
- Spring中使用DataSourceTransactionManager进行事务管理的xml配置
在一个业务的实现过程中,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个 ...
- 【Leetcode堆】数据流中的第K大元素(703)
题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数 ...
- Flask 第二篇
Flask 中的 Render Redirect HttpResponse 1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串 2 ...
- C++继承与构造函数、复制控制
每个派生类对象由派生类中定义的(非static)成员加上一个或多个基类子对象构成,因此,当构造.复制.赋值和撤销派生类型对象时,也会构造.复制.赋值和撤销这些基类子对象. 构造函数和复制控制成员不能继 ...