2008年NOIP普及组复赛题解
题目涉及算法:
- ISBN号码:简单字符串模拟;
- 排座椅:贪心;
- 传球游戏:动态规划;
- 立体图:模拟。
ISBN号码
题目链接:https://www.luogu.org/problem/P1055
简单字符串模拟。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
char c, s[20], d;
int cnt = 1, a;
int main() {
cin >> s;
for (int i = 0; i < 12; i ++) {
if (s[i] == '-') continue;
a = (a + cnt * (s[i] - '0') ) % 11;
cnt ++;
}
c = (a == 10) ? 'X' : ('0' + a);
if (c == s[12]) puts("Right");
else {
s[12] = c;
puts(s);
}
return 0;
}
排座椅
题目链接:
首先这道题目就是一个贪心,需要先记录一下每一行和它的下一行间有多少对交头接耳的同学,以及记录一下每一列和它的下一列间有多少交头接耳的同学。
然后按照同学对数从大到小排一下序。
但是这里有两个需要注意的地方:
- 输出结果的编号是需要从小打到排的;
- 洛谷上面的数据有重的(一直WA第8组数据),重的两个也算2组~
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int M, N, K, L, D, r1, c1, r2, c2;
bool vis[maxn][maxn][2];
vector<int> row_vec, col_vec;
struct Node {
int id, cnt;
Node() {}
Node(int _id) { id = _id; cnt = 0; }
} row[maxn], col[maxn];
bool cmp(Node a, Node b) { return a.cnt > b.cnt || a.cnt == b.cnt && a.id < b.id; }
int main() {
cin >> M >> N >> K >> L >> D;
for (int i = 1; i < M; i ++) row[i] = Node(i);
for (int i = 1; i < N; i ++) col[i] = Node(i);
while (D --) {
cin >> r1 >> c1 >> r2 >> c2;
if (r1 > r2) swap(r1, r2);
if (c1 > c2) swap(c1, c2);
if (c1 == c2) {
vis[r1][c1][0] = true;
row[r1].cnt ++;
}
if (r1 == r2) {
vis[r1][c1][1] = true;
col[c1].cnt ++;
}
}
sort(row+1, row+M, cmp);
sort(col+1, col+N, cmp);
for (int i = 1; i <= K; i ++) row_vec.push_back(row[i].id);
for (int i = 1; i <= L; i ++) col_vec.push_back(col[i].id);
sort(row_vec.begin(), row_vec.end());
sort(col_vec.begin(), col_vec.end());
for (vector<int>::iterator it = row_vec.begin(); it != row_vec.end(); it ++) {
if (it != row_vec.begin()) putchar(' ');
cout << (*it);
}
cout << endl;
for (vector<int>::iterator it = col_vec.begin(); it != col_vec.end(); it ++) {
if (it != col_vec.begin()) putchar(' ');
cout << (*it);
}
cout << endl;
return 0;
}
传球游戏
题目链接:https://www.luogu.org/problem/P1057
因为每次只能传相邻的,所以我们可以设 \(f[i][j]\) 表示第 \(i\) 轮传到编号为 \(j(0 \le j \lt n)\) 的同学的方案数。
则,当 \(i = 0\) 时,\(f[0][0] = 1\) ;
当 \(i \gt 0\) 时, \(f[i][j] = f[i-1][j] + f[i+1][j]\) (这里要注意边界问题,用模运算处理)。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 33;
int n, m;
long long f[maxn][maxn];
int main() {
cin >> n >> m;
f[0][0] = 1;
for (int i = 1; i <= m; i ++) {
for (int j = 0; j < n; j ++) {
f[i][j] = f[i-1][(j-1+n)%n] + f[i-1][(j+1)%n];
}
}
cout << f[m][0] << endl;
return 0;
}
立体图
题目链接:https://www.luogu.org/problem/P1058
这道题目是一道纯模拟问题。
解题思路:从最后一排(数据中的最上面一行)从左往右处理好最后一排(从小往上放),然后处理的倒数第二排(第2行),……,一直处理到最前面一排(最后一行)。
同时,在确定每一个方块未知的同时,也要确定一下整个输出矩形的大小范围。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int n, m, a[maxn][maxn], N, M;
char s[maxn][maxn];
void my_copy(char *s, char *t) {
while (*t) *s ++ = *t ++;
}
void paint(int x, int y) {
my_copy(s[x]+y, "+---+");
my_copy(s[x+1]+y, "| |/");
my_copy(s[x+2]+y, "| | +");
my_copy(s[x+3]+y, "+---+ |");
my_copy(s[x+4]+y+1, "/ /|");
my_copy(s[x+5]+y+2, "+---+");
}
int main() {
char sss[111];
cin >> n >> m;
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
cin >> a[i][j];
for (int j = 0; j < m; j ++) {
for (int i = 0; i < n; i ++) {
for (int k = 0; k < a[i][j]; k ++) {
int sx = (n-1-i) * 2 + 3 * k;
int sy = (n-1-i) * 2 + 4 * j;
N = max(N, sx + 6);
M = max(M, sy + 7);
paint(sx, sy);
}
}
}
for (int i = N-1; i >= 0; i --) {
for (int j = 0; j < M; j ++) {
if (!s[i][j]) putchar('.');
else putchar(s[i][j]);
}
putchar('\n');
}
return 0;
}
代码当中没有使用 strcpy 是因为测试了一下发现它最后会补一个 \0 。
作者:zifeiy
2008年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 ...
- 2005年NOIP普及组复赛题解
题目涉及算法: 陶陶摘苹果:入门题: 校门外的树:简单模拟: 采药:01背包: 循环:模拟.高精度. 陶陶摘苹果 题目链接:https://www.luogu.org/problem/P1046 循环 ...
- 2018年NOIP普及组复赛题解
题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...
- 2015年NOIP普及组复赛题解
题目涉及算法: 金币:入门题: 扫雷游戏:入门题: 求和:简单数学推导: 推销员:贪心. 金币 题目链接:https://www.luogu.org/problem/P2669 入门题,直接开一个循环 ...
随机推荐
- Phpstrom学习笔记
1.用*标识编辑过的文件 File - Editor – General - Editor Tabs 选中Mark modifyied tabs with asterisk
- web前端学习(三)css学习笔记部分(10)-- 初级开发工程师面试题
html所有基础.h5的所有基础.CSS所有常用的布局.CSS3新增的属性等等内容 附一个课程上用到的链接(转载): http://www.zhufengpeixun.cn/JavaScriptmia ...
- 忘记用了delete释放内存,如何防止内存溢出
C++的内存管理还是要自己来做的,自己要进行内存的申请和释放 程序直接kill掉,OS会回收的 但是面试要问到这个问题,其实是想问你别的 RAII,也称为“资源获取就是初始化”,是c++等编程语言常用 ...
- Element UI table组件源码分析
本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...
- oracle国家字符集
国家字符集是一个备用字符集,利用此字符集可以在没有Unicode 数据库字符集的数据库中存储 Unicode 字符. 选择国家字符集的其它原因如下: 对于频繁的字符处理操作,不同的字符编码方案可能更为 ...
- PHP基础-生成静态html页面原理是怎样
设置example.html为模板文件,然后按照此模板文件生成article-1.html~article-5.html,以此来做简单的演示,代码如下: <?php//将数据存入二维数组$con ...
- 【JZOJ4964】【GDKOI2017模拟1.21】Rhyme
hafy 由于多次交换邮票没有满足所有人的需求,小Z被赶出了集邮部.无处可去的小Z决定加入音乐部,为了让音乐部的人注意到自己的才华,小Z想写一首曲子.为了让自己的曲子更好听,小Z找到了一些好听曲子作为 ...
- Spark day06
SparkStreaming简介 SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展.高吞吐量.容错的实时数据流处理,实时数据的来源可以是:Kafka, Flume, ...
- 【itsdangerous】的加密解密原理(易懂版)
from itsdangerous import TimedJSONWebSignatureSerializer import time from itsdangerous import Signat ...
- 面向视频的全新AI架构 —— 阿里云智能视觉技术全解
我们都知道,AI技术正在以可见的速度被应用于各行各业,然而绝大部分业务场景想应用AI技术,都需要算法工程师根据自身业务的标注数据,来进行单独训练,才能打磨出合适的AI模型.如此一来,如何以最低的门槛和 ...