1、咒语

(curse.pas/c/cpp)

【题目描述】

亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。
亮亮拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动符咒,咒语是一串长为 L 的由 0 和 1 组成的字符串。在这张长纸条上列了 n 个长为 L 的字符串,正确的咒语即是在纷繁的 2^L 种字符串中,与这些纸条上的字符串相异度之和最小,并且在满足这一条件下, 0 的个数最多的字符串。两个字符串的相异度定义为对应位置不相等的字符对的个数。如‘011’和‘001’的相异度为 1,因为它们有且只有第二个位置上的字符不相等。”
亮亮拉起纸条,只觉得纸条似乎永远也拉不完。这上面有着数以万计的字符串,而每一个字符串的长度也或百或千,以人力看来是无法得到正确的咒语。你能帮帮他,让他得以进入魔法城堡,一窥其中的奥秘吗?

【输入格式】

第一行为一个数字 N 。

接下来的 N 行,每行为一个长为 L 的 01 字符串。数据保证 N 个字符串等长。

【输出格式】

只有一行,是一个长为 L 的字符串 S,即为正确的咒语。

【样例输入】

4
01011
01001
01101
10111

【样例输出】

01001

【数据规模】

对于 20%的数据, N<=5;

对于 60%的数据, N<=100;

对于 100%的数据, 1<=N<=1000, 1<=L<=1000。

题解:

按位模拟每一位对应的数字,p[i][0]:第i位'0'的个数, p[i][1]:第i位'1'的个数。
p[i][0] > p[i][1]时,为保证'字符串相异度之和最小',第i位为'0';
p[i][0] < p[i][1]时,为保证'字符串相异度之和最小',第i位为'1';
p[i][0] = p[i][1]时,为保证'0 的个数最多',第i位为'0';

#include <cstdio>
#include <cstring>
using namespace std;
char ch[1005];
int n, len, p[1005][2];
int main() {scanf("%d", &n);for(int i = 1;i <= n;i ++) {scanf("%s", ch + 1);if(len == 0) len = strlen(ch + 1);for(int j = 1;j <= len;j ++) p[j][(ch[j] - '0') & 1] ++;}for(int i = 1;i <= len;i ++)printf("%c", p[i][0] >= p[i][1] ? '0' : '1');return 0;
}

2、神光

(light.pas/c/cpp)

【题目描述】

亮亮成功地念出了咒语,石门缓缓地自动移开,一道道绚丽的神光从城堡内激射而出。亮亮好奇而又兴奋地走入了城堡中,迎面有一座极长的魔法阵。

魔法阵可以看作一条直线,它被均匀地分成了 1 000 000 000 个位置,一个位置可以看成是一个格子。有些位置上筑有法坛,一共 N 座。亮亮只有破了眼前的魔法阵,才能继续前进,而欲破法阵,必须毁掉所有的法坛。

亮亮身前有两根法杖:一根颜色血红,能发红色神光,光芒可以笼罩连续 L个位置,并摧毁这 L 个位置上所有的法坛,最多使用 R 次;另一根颜色碧绿,能发绿色神光,光芒可以笼罩连续 2L 个位置,并摧毁这 2L 个位置上所有的法坛,最多使用 G 次。

法杖的神奇之处在于, L 的值必须由亮亮事先设定好,并且一经设定,便无法更改。亮亮需要在规定的次数下摧毁所有法坛,并且使得 L 最小。

【输入格式】

第一行三个整数 N, R, G。

第 i (2<=i<=n+1) 行一个整数 Ai ,表示第 i 座法坛的位置。

【输出格式】

只有一个整数,表示 L 的最小值。

【样例输入】

3 1 1
22
17

【样例输出】

4 

【样例解释】

亮亮将 L 设为 4,并用红色神光笼罩 21-24 位置,用绿色神光笼罩 1-8 位置。

【数据规模】

对于 50%的数据, N <= 100;

对于 100%的数据, 1 <= N <= 2000, 1 <= R, G, Ai <= 1,000,000,000。

题解:

首先我们注意到,当 R 和 G 的大小超过了 N 时,L 的最小值就是 1,

因此,我们只 需要考虑 R 和 G 小于 N 的情况,于是 R,G 的规模就降到了 2000 以内。 显然要采用二分答案的方法。

那么问题转化为,判断给定的 L 能否摧毁所有法坛,我 们采用动态规划方法。首先将法坛的位置按照从小到大进行排序。

令 dp[i][j]表示,在用了 i 次红光,j 次绿光的情况下,最多从第一座法坛开始,一直摧毁到第几座法坛。

那么状态转 移方程即为 dp[i][j] = max ( P[dp[i-1][j] + 1], Q[dp[i][j-1] + 1] )。

其中 P[k]表示使用一次红光, 能从第 k 座法坛向右(正向为右)连续摧毁到第几座,Q[k]表示使用一次绿光,能从第 k 座 法坛向右连续摧毁到第几座。

P 和 Q 数组可以通过预处理得到。最终,我们只要判断 dp[R][G] 的值是否为 N 即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e3 + 5;
int read() {int x = 0, f = 1; char ch = getchar();while(ch < '0'||ch > '9') f = (ch=='-')?-1:1, ch = getchar();while(ch >= '0'&&ch <= '9') x=(x<<3)+(x<<1)+ch-'0', ch = getchar();return x * f;
}
int n, r, g, a[N], f[N][N], p[N], q[N];
bool check(int x) {memset(f, 0, sizeof(f));memset(p, 0, sizeof(p));memset(q, 0, sizeof(q));for(int i = 1;i <= n;i ++) {for(int j = i;j <= n;j ++) {if(a[j] - a[i] + 1 <= x) p[i] = j;if(a[j] - a[i] + 1 <= x * 2) q[i] = j;}}p[n+1] = q[n+1] = n;for(int i = 0;i <= r;i ++) {for(int j = 0;j <= g;j ++) {if(i > 0) f[i][j] = max(f[i][j], p[f[i-1][j]+1]);if(j > 0) f[i][j] = max(f[i][j], q[f[i][j-1]+1]);}}return f[r][g] == n;
}
int main() {n = read(); r = read(); g = read();if(n <= r + g) { printf("1\n"); return 0; }for(int i = 1;i <= n;i ++) a[i] = read();sort(a + 1, a + n + 1);int l = 1, r = 1e9 + 5;while(l < r) {int mid = (l + r) >> 1;if(check(mid)) r = mid;else l = mid + 1;}printf("%d\n", l);return 0;
}

3、迷宫

(maze.pas/c/cpp)

【题目描述】

破了魔法阵后,亮亮进入了一座迷宫。这座迷宫叫做“梦境迷宫”,亮亮只有走出这座迷宫,才能从睡梦中醒来。

梦境迷宫可以用无向图来表示。它共有 n 个点和 m 条双向道路,每条道路都有边权,表示通过这条道路所需的时间,且每条道路可以多次经过。亮亮位于一号点,而出口则是 n 号点。原本,亮亮该找到一条最短路,快速冲出迷宫,然而,梦境迷宫的特殊之处在于,如果沿着最短路到达出口,亮亮就会永远陷入梦境。因此,亮亮必须寻找一条次短路。次短路的长度须严格大于最短路(可以有多条)的长度,同时又不大于所有除最短路外的道路的长度。

你的任务,就是编写一个程序,帮助亮亮找到通向出口的次短路。

【输入格式】

第一行有两个整数 n、 m,表示迷宫内共有 n 个点, m 条边。

接下来 m 行,每行三个整数 x、 y、 z,表示结点 x 和 y 之间连有一条边权为z 的无向边。

【输出格式】

一个整数,表示次短路的长度。

【样例输入】

4 4
1 2 2
2 4 4
2 3 3
3 4 4

【样例输出】

9

【样例解释】

最短路: 1 -> 2 -> 4 (长度为 2+4=6)

次短路: 1 -> 2 -> 3 -> 4 (长度为 2+3+4=9)

【数据规模】

对于 100%的数据, 1 <= n <= 5000, 1 <= m <= 100,000。

对于 100%的数据, 1 <= z <= 5000, z 表示无向边的边长。

题解:

次短路模板题:
分别跑两遍 spfa(),
dis[i]: 点i到 1 号点的最短距离;
dis_[i]: 点i到 n 号点的最短距离;
之后, 枚举每条边(共2 * n条边),若x, y分别为这一条边的两个端点,
则dis[i]+dis_[y]+e[i].val即为经过此边的最短路,
在这些边中较 最短路 大的取最小值即可。

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N = 5e3 + 5, M = 1e6 + 5;
int read() {int x = 0, f = 1; char ch = getchar();while(ch < '0'||ch > '9') f = (ch=='-')?-1:1, ch = getchar();while(ch >= '0'&&ch <= '9') x=(x<<3)+(x<<1)+ch-'0', ch = getchar();return x * f;
}
int n, m, ans = 2e9 + 5;
struct edge { int from, nxt, to, val; } e[M];
int cnt, head[N], dis[N], b[N], dis_[N];
void add(int from, int to, int val) {e[++ cnt].to = to;e[cnt].from = from;e[cnt].val = val;e[cnt].nxt = head[from];head[from] = cnt;
}
void spfa() {queue <int> q; q.push(1); b[1] = 1;memset(dis, 0x3f, sizeof(dis)); dis[1] = 0;while(!q.empty()) {int tp = q.front(); q.pop(); b[tp] = 0;for(int i = head[tp]; i ;i = e[i].nxt) {if(dis[e[i].to] > dis[tp] + e[i].val) {dis[e[i].to] = dis[tp] + e[i].val;if(! b[e[i].to]) q.push(e[i].to), b[e[i].to] = 1;}}}
}
void spfa_() {memset(b, 0, sizeof(b));queue <int> q; q.push(n); b[n] = 1;memset(dis_, 0x3f, sizeof(dis_)); dis_[n] = 0;while(!q.empty()) {int tp = q.front(); q.pop(); b[tp] = 0;for(int i = head[tp]; i ;i = e[i].nxt) {if(dis_[e[i].to] > dis_[tp] + e[i].val) {dis_[e[i].to] = dis_[tp] + e[i].val;if(! b[e[i].to]) q.push(e[i].to), b[e[i].to] = 1;}}}
}
int main() {n = read(); m = read();for(int i = 1, x, y, z;i <= m;i ++) x = read(), y = read(), z = read(), add(x, y, z), add(y, x, z);spfa(); spfa_();for(int i = 1;i <= cnt;i ++) {int len = dis[e[i].from] + dis_[e[i].to] + e[i].val;if(len > dis[n]) ans = min(ans, len);}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/Paranoid-LS/p/11070430.html

2019.6.21 NOIP2018提高组模拟题(二)相关推荐

  1. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  2. JZOJ 5878. 【NOIP2018提高组模拟9.22】电路图 A

    Description nodgd 要画一个电路图. 这是一个很简单的电路图,所有的元件都是串联关系,从整体来看就是一个环状的结构.画电路图有很多要求,nodgd 为了画得好看就又添加了一些 额外的要 ...

  3. noip2012提高组模拟题樱桃庄园

    本题是一个动态规划背包问题. 题目如下: [问题描述] 高考结束啦!结束啦!高考结束第一天,大黑带着她的宠物--麻婆来到一个樱桃园,他们要来摘樱桃吃啦. 这时大黑对他的宠物麻婆说:"你想不想 ...

  4. NOIP2018提高组比赛总结

    NOIP2018提高组比赛总结 前言 新赛季,依旧有很多失误. 在些许的遗憾和无奈中,NOIP2018,撒花结束 纵观今年的整一场NOIP,有许多值得总结的地方 正文 NOIP2018初赛 第二次参加 ...

  5. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  6. NOIP2018 提高组游记

    NOIP2018 提高组游记的重点不是NOIP而是游记!!! 本文分为 4 个部分: 1.关于2017, 以及自己的简介 2.noip2018游记 3.写给高一高二的学弟学妹 4.写给高三的同学和自己 ...

  7. NOIP2018提高组心路历程(AFO+自闭)

    NOIP2018提高组历程(AFO+自闭) 在不断地考试考试考试(浪浪浪)中,不知不觉,11月9号这个出征日就到来了,再出发前还是有很多小插曲的(比如刚好正面遇到她,吃好饭后还对视了一眼).随着大巴的 ...

  8. P5049 [NOIP2018 提高组] 旅行

    P5049 [NOIP2018 提高组] 旅行 题意: 一棵树(可能是基环树),从1出发,每到达一个新的点就记录下编号.求一种走法使得记录下来的编号字典序最小. 1≤n≤500000 m=n−1 或 ...

  9. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  10. NOIP2018提高组省一冲奖班模测训练(三)

    NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...

最新文章

  1. puml绘制思维导图_如何用ProcessOn画出漂亮的思维导图
  2. 万达放弃A股上市,数据揭秘王思聪投资为何频繁跳水?
  3. Python之Django框架开发博客
  4. GANs最新综述论文: 生成式对抗网络及其变种如何有用【附pdf下载】
  5. docker-ovs遇到的问题以及解决办法
  6. 【HDU5156】Harry and Christmas tree,两种离线的做法
  7. CSO安全手册中的七条守则
  8. datagrid 重载本地数据_DataGrid 的DataSource重新加载数据
  9. 计算机网络实验:netmeeting 在局域网上的应用
  10. 【Spark】Spark安装详解
  11. Oracle long 类型转 varchar2
  12. 叉乘点乘混合运算公式_《3D数学基础》提炼总结(四)向量运算(后)
  13. 基于Java语言实现全国交通咨询模拟
  14. 购买计算机网络设备的会计分录,企业购买设备的会计分录怎么写?
  15. 全国公立医院病案首页上报系统(适用于二、三级医院)
  16. eNSP配置(直连/静态/动态路由,DHCP,单臂路由,ACL,NAT,链路聚合,负载均衡,WLAN,备份路由)
  17. echarts 柱状图数字在顶部显示
  18. 怎么把录音导入库乐队_库乐队怎么导入音乐_怎么将音乐导入到库乐队中 库乐队导入音乐的方法...
  19. 【机器学习详解】SVM解回归问题
  20. OpenAI祭出120亿参数魔法模型!从文本合成图像栩栩如生,仿佛拥有人类的语言想象力...

热门文章

  1. 学校生均计算机台数统计表,学校计算机数量名称、型号、数量、发布情况统计表...
  2. UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。
  3. Linux基础命令01(ls , cd,clear,cat等)
  4. Nginx编译时error: assignment makes pointer from integer without a cast处理
  5. 范式的判定——数据库考试复习
  6. 编写python爬虫基础_0基础如何快速写python爬虫
  7. HDU-4826 Labyrinth
  8. 80C51 单片机使用汇编语言编写点亮和熄灭绿色LED流水灯附PROTEUS8仿真电路及效果(一)
  9. 保送北大,连发三篇Science,这位80后川妹子近日再发重磅级研究成果!
  10. 自学编程之前,你需要知道这些