题目涉及算法:

  • 买铅笔:入门题;
  • 回文日期:枚举;
  • 海港:双指针;
  • 魔法阵;数学推理。

买铅笔

题目链接:https://www.luogu.org/problem/P1909

设至少要买 \(num\) 只笔,且对于每只钱币,设它的价格为 \(a\) ,笔数为 \(b\) ,则花费为最大的那个 \(\lceil \frac{num}{a} \rceil \times b\) 。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int num, a, b, ans = INT_MAX;
int main() {
cin >> num;
for (int i = 0; i < 3; i ++) {
cin >> a >> b;
ans = min(ans, (num+a-1)/a*b);
}
cout << ans << endl;
return 0;
}

回文日期

题目链接:https://www.luogu.org/problem/P2010

使用枚举解决,实现代码如下:

#include <bits/stdc++.h>
using namespace std; string start_date, end_date;
int cnt; void solve(int year) {
int a[8];
a[0] = year / 1000;
a[1] = year / 100 % 10;
a[2] = year / 10 % 10;
a[3] = year % 10;
for (int i = 0; i < 4; i ++) a[7-i] = a[i];
int month = a[4]*10 + a[5];
int day = a[6]*10 + a[7];
if (month < 1 || month > 12) return;
int dd = 31;
if (month<8 && month%2==0 || month>7 && month%2!=0) dd = 30;
else if (month == 2) {
if (year%400==0 || year%4==0&&year%100!=0) dd = 29;
else dd = 28;
}
if (day < 1 || day > dd) return;
string s = "";
for (int i = 0; i < 8; i ++) {
s += (char) ('0' + a[i]);
}
if (s >= start_date && s <= end_date) cnt ++;
} int main() {
cin >>start_date >> end_date;
for (int i = 0; i < 10000; i ++) solve(i);
cout << cnt << endl;
return 0;
}

海港

题目链接:https://www.luogu.org/problem/P2058

本题涉及算法:双指针法。

我们令 \(c[i]\) 表示当前时刻在海港内国别为 \(i\) 的人数,令 \(cnt\) 表示当前时刻海港内有多少个不同国别的人。

我们一开始另 \(j = 0\) ,然后从 \(0\) 到 \(n-1\) 遍历 \(i\) :

对于变量 \(i\) ,首先遍历它里面所有国别 \(x\) ,\(c[x] ++\) ,如果此时 \(c[x] = 1\) ,说明这个国别是第一次有,令 \(cnt ++\) ;

只要满足 \(t[j] \le t[i] - 86400\) ,我们就执行如下操作:

遍历 \(t[j]\) 时刻所有旅客的国别 \(x\) ,\(c[x] --\) ,如果此时 \(c[x] = 0\) ,说明这个国别的旅客都没有了,令 \(cnt --\);然后就是 \(j++\) ,直到 \(t[j] \gt t[i] - 86400\) 。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int DELTA = 86400;
int n, a, t[maxn], k[maxn], c[maxn], cnt;
vector<int> x[maxn];
void my_add(int id) { // 增加编号为id的信息
for (int i = 0; i < k[id]; i ++) {
int a = x[id][i];
c[a] ++;
if (c[a] == 1) cnt ++;
}
}
void my_del(int id) { // 删除编号为id的信息
for (int i = 0; i < k[id]; i ++) {
int a = x[id][i];
c[a] --;
if (c[a] == 0) cnt --;
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> t[i] >> k[i];
for (int j = 0; j < k[i]; j ++) {
cin >> a;
x[i].push_back(a);
}
}
for (int i = 0, j = 0; i < n; i ++) {
my_add(i);
while (t[j] <= t[i] - DELTA) {
my_del(j ++);
}
cout << cnt << endl;
}
return 0;
}

魔法阵

题目链接:https://www.luogu.org/problem/P2119

题解:本着不重复造轮子的思想,请转 yhf2000 大神的博文:https://www.luogu.org/blog/yhf/solution-p2119

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 15010, maxm = 40040;
int n, m, a[maxn], b[maxn], c[maxn], d[maxn], val[maxm], cnt[maxn];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i ++) {
scanf("%d", &val[i]);
cnt[ val[i] ] ++;
}
for (int i = 1; 2+9*i <= n; i ++) {
int tmp = 0;
for (int j = 2+9*i; j <= n; j ++) {
tmp += cnt[j-1-9*i] * cnt[j-1-7*i];
c[j-i] += cnt[j] * tmp;
d[j] += cnt[j-i] * tmp;
}
tmp = 0;
for (int j = n-1-9*i; j >= 1; j --) {
tmp += cnt[j+1+8*i] * cnt[j+1+9*i];
a[j] += cnt[j+2*i] * tmp;
b[j+2*i] += cnt[j] * tmp;
}
}
for (int i = 0; i < m; i ++)
printf("%d %d %d %d\n", a[ val[i] ], b[ val[i] ], c[ val[i] ], d[ val[i] ]);
return 0;
}

作者:zifeiy

2016年NOIP普及组复赛题解的更多相关文章

  1. 2010年NOIP普及组复赛题解

    题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...

  2. 2017年NOIP普及组复赛题解

    题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...

  3. 2014年NOIP普及组复赛题解

    题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...

  4. 2013年NOIP普及组复赛题解

    题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...

  5. 2011年NOIP普及组复赛题解

    题目涉及算法: 数字反转:模拟: 统计单词数:模拟: 瑞士轮:模拟/排序: 表达式的值:后缀表达式/DP. 数字反转 题目链接:https://www.luogu.org/problem/P1307 ...

  6. 2008年NOIP普及组复赛题解

    题目涉及算法: ISBN号码:简单字符串模拟: 排座椅:贪心: 传球游戏:动态规划: 立体图:模拟. ISBN号码 题目链接:https://www.luogu.org/problem/P1055 简 ...

  7. 2005年NOIP普及组复赛题解

    题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...

  8. 2018年NOIP普及组复赛题解

    题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...

  9. 2015年NOIP普及组复赛题解

    题目涉及算法: 金币:入门题: 扫雷游戏:入门题: 求和:简单数学推导: 推销员:贪心. 金币 题目链接:https://www.luogu.org/problem/P2669 入门题,直接开一个循环 ...

随机推荐

  1. ML面试1000题系列(61-70)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 61.说说共轭梯度法? @wtq1993,htt ...

  2. Android中使用ormlite实现持久化--HelloOrmLite

    Android中内置了sqlite,但是常用的开发语言java是面向对象的,而数据库是关系型的,二者之间的转化每次都很麻烦(主要是我对sql语言不熟悉).而Java Web开发中有很多orm框架,但是 ...

  3. html5之本地数据库

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  4. FreeMarker中<#include>和<#import>标签的区别

    在使用freemarker作为前端页面模板的应用中,会有很多的freemarker模板页面,这些ftl会在不同的页面中重复使用,一是为了简化布局的管理,二是可以重复使用一些代码. 在freemarke ...

  5. iOS 中的 Deferred Deep Linking(延迟深度链接)

    http://www.cocoachina.com/ios/20160105/14871.html Deep Linking 其实 deep linking 并不是一个新名词,在 web 开发领域,区 ...

  6. Leetcode707.Design Linked List设计链表

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  7. Directx11教程(33) 纹理映射(3)

    原文:Directx11教程(33) 纹理映射(3)       现在我们在myTutorialD3D11_5的基础上,来逐步编码实现纹理映射,之所以在myTutorialD3D11_5基础上改写,是 ...

  8. WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下)

    原文:WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下) 本想只用两节来完成关于HLSL自定义渲染相关知识的讲解,鉴于最近非常的多的朋友对此相当感兴趣,想知道最多 ...

  9. C++之以分隔符的形式获取字符串

    void CConvert::Split(const std::string& src, const std::string& separator, std::vector<st ...

  10. PyCharm切换Python版本

    由于代码格式问题,很多情况下需要我们去切换Python版本,那么在当下火爆的PyCharm中是如何切换Python版本的呢? 打开File菜单,选择Settings: 打开Settings窗口后,选择 ...