题目涉及算法:

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

多项式输出

题目链接: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. LUOGU P2587 [ZJOI2008]泡泡堂

    传送门 解题思路 刚开始先写了个田忌赛马的贪心,就是要是打不过就拿最弱的送死,30分...后来瞄了眼题解,发现这样是错的,比如说这样的数据 : 3 3 2 3 1 如果用田忌赛马的话,让2-3 3-1 ...

  2. KMLLayer

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Ubuntu卸载通过apt-get命令安装的软件

    卸载一个已安装的软件包(删除配置文件): apt-get --purge remove packagename

  4. <第一周> city中国城市聚类 testdata学生上网聚类 例子

    中国城市聚类 # -*- coding: utf-8 -*- kmeans算法 """ Created on Thu May 18 22:55:45 2017 @auth ...

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

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

  6. oracle-600错误

    event='10841 trace name context forever' 可以屏蔽这个ORA-00600错误. SQL> show parameter event NAME TYPE V ...

  7. WPF HTTP请求(GET,POST)

    WPF HTTP请求(GET,POST) using System; using System.Collections.Generic; using System.IO; using System.L ...

  8. .net 数据表格显示控件

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/chenjinge7/article/details/30470609 1. GridView 控件 ...

  9. [React Native]StatusBar的使用

    StatusBar是React Native 0.20 新增的跨平台组件,它可以用来设置并动态改变设备的状态栏显示特性. 虽然说是跨平台的组件, 但是有些属性不是跨平台的 ,我们需要注意下.因为IOS ...

  10. POLARDB v2.0 技术解读

    点击观看“POLARDB 2.0 升级发布会”:https://yq.aliyun.com/live/1136 回顾POLARDB 1.0 POLARDB 1.0 主要的改进包括采用了计算存储分离的架 ...