题目涉及算法:

  • 多项式输出:模拟;
  • 分数线划定:模拟、排序;
  • 细胞分裂:质因数分解;
  • 道路游戏:动态规划。

多项式输出

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

纯模拟题。注意符号和1、0。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int n, a[maxn];
int main() {
cin >> n;
for (int i = n; i >= 0; i --) cin >> a[i];
while (n > 0 && !a[n]) n --;
if (n == 0) {
cout << a[0] << endl;
return 0;
}
for (int i = n; i >= 0; i --) {
if (!a[i]) continue;
if (i < n && a[i] > 0) putchar('+');
if (i == 0) {
cout << a[i];
continue;
}
if (a[i] == 1) ;
else if (a[i] == -1) putchar('-');
else cout << a[i];
if (i > 0) cout << "x";
if (i > 1) cout << "^" << i;
}
cout << endl;
return 0;
}

分数线划定

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

这道题是一道简单的模拟题,只需要排序+输出响应结果即可。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
struct Node {
int k, s; // 分别表示报名号和成绩
} a[5005];
int n, m;
bool cmp(Node a, Node b) {
if (a.s != b.s) // 如果成绩不同
return a.s > b.s; // 按成绩从高到低排
return a.k <b.k; // 否则,按报名号从小到大排
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++)
cin >> a[i].k >> a[i].s;
sort(a, a+n, cmp);
int line = a[m*3/2-1].s; // line表示分数线
int id = m*3/2-1; // id对应最后录取的那个人的坐标
while (id+1 < n && a[id+1].s == line) id ++;
cout << line << " " << id+1 << endl; // 输出分数线及录取人数
for (int i = 0; i <= id; i ++) // 输出录取人的名单
cout << a[i].k << " " << a[i].s << endl;
return 0;
}

细胞分裂

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

这道题目考的其实是质因数分解。

这道题目可以翻译成这样:

给你一个数 \(M = m1^{m2}\) ,然后给你 \(n\) 个数 \(S_i\) ,在所有 \(Si\) 中你要找到一个最小的答案 \(ans\) 使得 \(S_i^{ans}\) 能被 \(M\) 整数。

使用质因数分解直接解决。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, m1, m2, cnt, s[maxn], a[maxn], b[maxn], c[maxn], ans = -1;
int main() {
cin >> n >> m1 >> m2;
int m = m1;
for (int i = 2; i * i <= m1; i ++) {
if (m % i == 0) {
a[cnt] = i;
while (m % i == 0) {
m /= i;
c[cnt] ++;
}
cnt ++;
}
}
if (m > 1) {
a[cnt] = m;
c[cnt++] = 1;
}
for (int i = 0; i < cnt; i ++) c[i] *= m2;
for (int i = 0; i < n; i ++) {
cin >> s[i];
m = s[i];
memset(b, 0, sizeof(int)*cnt);
bool flag = true;
for (int j = 0; j < cnt; j ++) {
if (m % a[j]) {
flag = false;
break;
}
while (m % a[j] == 0) {
b[j] ++;
m /= a[j];
}
}
if (flag) {
int tmp = 0;
for (int j = 0; j < cnt; j ++) {
tmp = max(tmp, (c[j] + b[j]-1) / b[j] );
}
if (ans == -1 || ans > tmp) ans = tmp;
}
}
cout << ans << endl;
return 0;
}

道路游戏

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

这道题目使用动态规划解决。

我们假设有n个点,m个时刻,则我们令:

  • \(cost[i]\) :表示第 \(i\) 个点部署一个机器人的花费;
  • \(coin[i][j]\) :表示第 \(j\) 时刻第 \(i\) 条路的金币;
  • \(f[i][j]\) :表示第 \(j\) 时刻处在第 \(i\) 个点的最高收益。

我们可以通过当前的 \(f[i][j]\) 来更新 \(f[i+1][j+1]、f[i+2][j+2]、\dots f[i+p][j+p]\) ,因为我们可以假设从 \(f[i][j]\) 花费 \(cost[i]\) 来部署一个机器人来更新后面的 \(p\) 个状态。

同时,\(f[i][j]\) 应该是线面两项中的最大值:

  1. \(f[i][j]\) 本身,这个状态是根据之前 \(\lt i\) 的若干状态推导出来的;
  2. \(\max ( f[k][j] )\) ,其中 \(1 \le k \le n\) 。

因为我可以从任何一个 \(f[k][j]\) 跳转到第 \(i\) 个点来部署机器人。

这道题目一定要注意好多题目描述中的细节。

之前一直错最后一组数据,后来次啊发现是因为题目描述中有一句话:

“当马路上的机器人行走完规定的次数之后会自动消失,小新必须立刻在任意一个机器人工厂中购买一个新的机器人,并给新的机器人设定新的行走次数。”

这就是说:我每时每刻都得布置机器人,所以需要将 \(f[i][j]\) 初始值置为 \(- \infty\) 。

下面是修改后AC的代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, m, p;
long long coin[maxn][maxn], cost[maxn], f[maxn][maxn], ans;
void init() {
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m+1; j ++) {
if (j == 1) f[i][j] = 0;
else f[i][j] = INT_MIN;
}
}
}
int main() {
cin >> n >> m >> p;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> coin[i][j];
for (int i = 1; i <= n; i ++) cin >> cost[i];
init();
for (int j = 1; j <= m; j ++) {
long long maxf = INT_MIN;
for (int i = 1; i <= n; i ++) maxf = max(maxf, f[i][j]);
for (int i = 1; i <= n; i ++) {
f[i][j] = maxf;
long long tmp = f[i][j] - cost[i];
int ii = i, jj = j;
for (int k = 0; k < p; k ++) {
tmp += coin[ii][jj];
ii ++;
jj ++;
if (ii > n) ii = 1;
if (jj > m+1) break;
f[ii][jj] = max(f[ii][jj], tmp);
}
}
}
for (int i = 1; i <= n; i ++)
ans = max(ans, f[i][m+1]);
cout << ans << endl;
return 0;
}

作者:zifeiy

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

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

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

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

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

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

    题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 洛谷 3112 [USACO14DEC]后卫马克Guard Mark——状压dp

    题目:https://www.luogu.org/problemnew/show/P3112 状压dp.发现只需要记录当前状态的牛中剩余承重最小的值. #include<iostream> ...

  2. webpack学习之—— Configuration(配置)

    你可能已经注意到,很少有 webpack 配置看起来很完全相同.这是因为 webpack 的配置文件,是导出一个对象的 JavaScript 文件.此对象,由 webpack 根据对象定义的属性进行解 ...

  3. LintCode_133 最长单词

    题目 给一个词典,找出其中所有最长的单词. 样例 在词典 { "dog", "google", "facebook", "inte ...

  4. golang函数二

  5. eclipse修改中文注释的字体(亲测有用!)

    Window –> Preferences –> General –> Appearance –> Colors and Fonts –> Basic –> Tex ...

  6. POJ 1150 The Last Non-zero Digit 数论+容斥

    POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: id=1150" rel="nofollow" style="colo ...

  7. [Vue CLI 3] 配置解析之 css.extract

    大家还记得我们在老版本中,对于线上环境配置中会把所有的 css 多打成一个文件: 核心是使用了插件 extract-text-webpack-plugin,方式如下: 第一步都是加载插件 const ...

  8. PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)

    正则表达式由字符和操作符构成 . 表示任何单个字符 []字符集,对单个字符给出取值范围 [abc]或者关系  [a-z]表示 [^abc]表示非这里面的东西 非字符集 * 表示星号之前的字符出现0次或 ...

  9. SDUT-3404_数据结构实验之排序七:选课名单

    数据结构实验之排序七:选课名单 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 随着学校规模的扩大,学生人数急剧增加,选 ...

  10. JSP Web第四章整理复习 JSP技术基础

    P104 JSP简介 (1)基本概念:jsp技术.jsp.jsp网页组成 JSP技术基础java servlet和整个java体系的Web服务器端开发技术. JSP表示它是用java写的Web服务页面 ...