题目涉及算法:

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

多项式输出

题目链接: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. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  2. SpringBoot实战之异常处理篇

    在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然 ...

  3. 【水滴石穿】react-native-video-project

    感觉这个是很有才华的博主,毕竟是可以在npm 包里面留后门的程序员 博主的gihtub关于这个项目的地址是:https://github.com/ikimiler/react-native-video ...

  4. PHP学习(数组)

    数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西. PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 索引数组 先介绍下索引数组,索 ...

  5. Markdown 常用语法学习(stackedit)

    Welcome to StackEdit!{#welcome} ===================== Hello, I am your first Markdown document withi ...

  6. 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵

    题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...

  7. python os 模块介绍

    """ 重命名文件 os.rename(src,dst) os.rename('123.txt','124.txt') 删除文件 os.remove(path) os.r ...

  8. Spark day05

    Shark Shark是基于Spark计算框架之上且兼容Hive语法的SQL执行引擎,由于底层的计算采用了Spark,性能比MapReduce的Hive普遍快2倍以上,当数据全部load在内存的话,将 ...

  9. oracle触发器——ddl触发器

    什么是ddl(data definition language),说白了就是我们经常用的create.alter和drop这些数据定义语句. n  创建ddl触发器 请编写一个触发器,可以记录某个用户 ...

  10. SDUT-2124_基于邻接矩阵的广度优先搜索遍历

    数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个无向连通图 ...