好久没刷51nod了,又听说topcoder有很多好题。那么就来51nod上刷吧。(那个客户端搞得有点烦(看不懂))

[1366 贫富差距]

当图不连通的时候,答案为无穷大。

当图连通时,两个点之间的最大差值就是最短路长度乘上 $d$,跑floyd再看最短路的最大值即可。

 #include <bits/stdc++.h>

 const int N = ;
const int INF = 0x3f3f3f3f; char s[N];
int mp[N][N], fa[N], n; int getfa(int x) {
return x == fa[x] ? x : fa[x] = getfa(fa[x]);
} void unit(int x, int y) {
x = getfa(x), y = getfa(y);
fa[x] = y;
} void floyd() {
for (int k = ; k <= n; k++)
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
mp[i][j] = std::min(mp[i][j], mp[i][k] + mp[k][j]);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
int d;
scanf("%d%d", &n, &d);
for (int i = ; i <= n; i++) fa[i] = i;
for (int i = ; i <= n; i++) {
scanf("%s", s + );
for (int j = ; j <= n; j++) {
if (s[j] == 'Y' && i != j)
mp[i][j] = d, unit(i, j);
else if (i != j)
mp[i][j] = INF;
else
mp[i][j] = ;
}
}
int cnt = ;
for (int i = ; i <= n; i++)
if (getfa(i) == i) cnt++;
if (cnt > ) {
puts("-1");
continue;
}
floyd();
int ans = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
if (mp[i][j] < INF)
ans = std::max(ans, mp[i][j]);
printf("%d\n", ans);
}
return ;
}

[1402 最大值]

可以发现当限制比数字的位置还大时,这个限制就没用了。

然后有时候到不了极限数据,因为被前面的卡住了或者被后面的卡住了。

即 $t_i - t_{i - 1} > x_i - x_{i - 1}$,$t_i - t_{i + 1} > x_{i + 1} - x_i$ 这两种情况。暴力更新即可。

然后最大值就在每两个限制之间得到。

#include <bits/stdc++.h>

const int N = ;

int x[N], t[N];

int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
int cnt = ;
x[cnt] = , t[cnt] = ;
for (int i = ; i <= m; i++) {
int a, b;
scanf("%d%d", &a, &b);
if (b < a - )
x[++cnt] = a, t[cnt] = b;
}
if (!cnt) {
printf("%d\n", n - );
continue;
}
for (int i = ; i <= cnt; i++) {
if (i > && t[i] - t[i - ] > x[i] - x[i - ])
t[i] = t[i - ] + x[i] - x[i - ];
if (i < cnt && t[i] - t[i + ] > x[i + ] - x[i]) {
t[i] = t[i + ] + x[i + ] - x[i];
i = ;
}
}
int ans = ;
for (int i = ; i < cnt; i++)
ans = std::max(ans, (t[i] + t[i + ] - x[i] + x[i + ]) / );
ans = std::max(ans, t[cnt] + n - x[cnt]);
printf("%d\n", ans);
}
}

[1418 放球游戏]

一种球的贡献最多为 $2$,那么统计球的个数即可。

#include <bits/stdc++.h>

const int N = ;
char s[N];
int cnt[]; inline int getid(char ch) {
if (ch == 'R') return ;
if (ch == 'G') return ;
return ;
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%s", s + );
int n = strlen(s + );
if (n == ) {
puts("");
continue;
}
if (n == ) {
puts("");
continue;
}
for (int i = ; i < ; i++)
cnt[i] = ;
for (int i = ; i <= ; i++)
cnt[getid(s[i])]++;
int ans = ;
for (int i = ; i <= n; i++) {
for (int j = ; j < ; j++)
ans += std::min(cnt[j], );
cnt[getid(s[i])]++;
}
printf("%d\n", ans);
}
return ;
}

[1487 占领资源]

和一个点会有交集的点最多只有 $k^2$ 个,特判这些点,再去其他点中最大的那个即可。

#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second const int N = ;
const int M = 1e4 + ;
int dx[], dy[];
char s[N];
int mp[N][N];
std::vector<int> belong[M];
std::pii p[M];
std::map<std::pii, int> gong; int main() {
freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= n; i++) {
scanf("%s", s + );
for (int j = ; j <= m; j++)
mp[i][j] = s[j] - '';
}
for (int i = ; i <= k; i++)
scanf("%d%d", &dx[i], &dy[i]);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
int pos = (i - ) * m + j;
p[pos].se = pos;
p[pos].fi = ;
for (int z = ; z <= k; z++) {
int x = i + dx[z], y = j + dy[z];
if (x <= || x > n || y <= || y > m) continue;
belong[(x - ) * m + y].push_back(pos);
p[pos].fi += mp[x][y];
}
}
int ans = ;
std::sort(p + , p + n * m + , std::greater<std::pii>());
for (int cnt = ; cnt <= n * m; cnt++) {
gong.clear();
int pos = p[cnt].se;
int i = pos / m, j = pos % m;
if (!j) j = m;
else i++;
if (p[cnt].fi + p[].fi <= ans) continue;
for (int z = ; z <= k; z++) {
int x = i + dx[z], y = j + dy[z];
if (x <= || x > n || y <= || y > m) continue;
int ne = (x - ) * m + y;
for (int tong: belong[ne]) {
if (pos == tong) continue;
gong[std::pii(std::min(pos, tong), std::max(pos, tong))] -= mp[x][y];
}
}
for (int z = ; z <= k * k + ; z++) {
if (z == cnt) continue;
int id = p[z].se;
ans = std::max(ans, gong[std::pii(std::min(pos, id), std::max(pos, id))] + p[cnt].fi + p[z].fi);
if (!gong.count(std::pii(std::min(pos, id), std::max(pos, id)))) break;
}
}
for (int i = ; i <= n * m; i++)
belong[i].clear(), p[i].fi = p[i].se = ;
printf("%d\n", ans);
}
return ;
}

[1445 变色DNA]

唉,这都想不出来,好菜啊...

$i$ 到 $j$ 的代价就等于第 $i$ 行 $0$ 到 $j - 1$ 有多少个 'Y'。要优先走这条边就要付出这么多代价,然后floyd就好了

#include <bits/stdc++.h>

const int N = ;
const int INF = 0x3f3f3f3f;
int mp[N][N];
char s[N]; int main() {
int T;
scanf("%d", &T);
while (T--) {
memset(mp, 0x3f, sizeof mp);
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%s", s + );
int cost = ;
for (int j = ; j <= n; j++)
if (s[j] == 'Y')
mp[i][j] = cost++;
}
for (int i = ; i <= n; i++)
mp[i][i] = ;
for (int k = ; k <= n; k++)
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
mp[i][j] = std::min(mp[i][j], mp[i][k] + mp[k][j]);
printf("%d\n", mp[][n] == INF ? - : mp[][n]);
}
return ;
}

[1351 吃点心]

当取的 $low$ 值之和不小于 $x$ 时,为一个方案

当不取的 $high$ 值之和不大于 $c - x$ 时,为一个方案

这两种情况可以独立来算,对 $low$ 和 $high$ 分别排个序就ok了。

#include <bits/stdc++.h>

const int N = ;

int low[N], high[N];

int main() {
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int n, c, x;
scanf("%d%d%d", &n, &c, &x);
for (int i = ; i <= n; i++)
scanf("%d%d", low + i, high + i);
int ans = n;
std::sort(low + , low + + n);
std::sort(high + , high + + n);
for (int i = n, sum = ; i; i--) {
sum += low[i];
if (sum >= x) {
ans = std::min(n - i + , ans);
break;
}
}
for (int i = , sum = ; i <= n; i++) {
sum += high[i];
if (c - sum < x) {
ans = std::min(ans, n - i + );
break;
}
}
printf("%d\n", ans);
}
return ;
} /***
34
32
28
***/

[1337 翻转游戏]

当不出现问号时,该开时开,该关时关就OK了。

当出现了问号时,如果上一轮的该位置状态为 '-' 且这一轮有开灯的操作,那么这一位就可以是 '?',或者该位置状态为 '+' 且这一轮有关灯的操作,同理也是 '?'

多一个 '?' 就可以让之后尽量少操作。

#include <bits/stdc++.h>

const int N = ;
char mp[N][N], s[N]; int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%s", mp[i] + );
for (int i = ; i <= m; i++)
s[i] = '-';
int ans = ;
for (int i = ; i <= n; i++) {
bool open = , close = ;
for (int j = ; j <= m; j++) {
if (s[j] == '-' && mp[i][j] == '+')
open = ;
if (s[j] == '+' && mp[i][j] == '-')
close = ;
}
if (open) ans++;
if (close) ans++;
ans++;
for (int j = ; j <= m; j++) {
if (mp[i][j] == '?') {
if (close && s[j] == '+')
s[j] = '?';
if (open && s[j] == '-')
s[j] = '?';
} else {
s[j] = mp[i][j];
}
}
}
printf("%d\n", ans);
}
return ;
}

[1388 六边形平面]

答案最多为 3,为 3 时即存在奇环,bfs判一下即可。

#include <bits/stdc++.h>

const int N = ;
const int dir[][] = {{-, }, {-, }, {, }, {, }, {, -}, {, -}};
char s[N][N];
int n, dis[N][N]; bool bfs(int dx, int dy) {
std::queue< std::pair<int, int> > que;
que.push(std::pair<int, int>(dx, dy));
while (!que.empty()) {
std::pair<int, int> p = que.front(); que.pop();
int i = p.first, j = p.second;
for (int k = ; k < ; k++) {
int x = i + dir[k][], y = j + dir[k][];
if (x < || y < || x > n || y > n || s[x][y] == '-') continue;
if (dis[x][y]) {
if (dis[x][y] % == dis[i][j] % ) return true;
continue;
}
que.push(std::pair<int, int>(x, y));
dis[x][y] = dis[i][j] + ;
}
}
return false;
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
int ans = ;
for (int i = ; i <= n; i++) {
scanf("%s", s[i] + );
for (int j = ; j <= n; j++)
if (s[i][j] == 'X') ans = ;
}
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) if (s[i][j] == 'X') {
for (int k = ; k < ; k++) {
int x = i + dir[k][], y = j + dir[k][];
if (x < || y < || x > n || y > n || s[x][y] == '-') continue;
ans = ;
}
}
memset(dis, , sizeof(dis));
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
if (s[i][j] == 'X' && dis[i][j] == )
if (bfs(i, j)) ans = ;
printf("%d\n", ans);
}
return ;
}

#51nod上topcoder练习记的更多相关文章

  1. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛

    OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...

  2. -bash: 无法为立即文档创建临时文件: 设备上没有空间---记一次报错

    故障发生原因 测试环境,之前用该机器做过docker-compose,后来有需要用到该机器上的docker环境,需要将旧的docker容器全部删除,由于之前启动是使用docker-compose启动的 ...

  3. 几道51nod上据说是提高组难度的dp题

    1409 加强版贪吃蛇 听着懵逼做着傻逼. 每个格子只能经过一次,穿过上下界答案清0,不考虑穿的话就随便dp.如果要穿就是从尽可能上面的位置穿过上界,尽可能下面的位置穿过下界. 那么转移这一列之前找一 ...

  4. GitHub上传家庭记账本

    GitHub的使用参考之前的博客GitHub的初步了解和使用,并完成了相关的android个人家庭记账本的上传

  5. mac上安装brew----笔记

    一.mac 终端下,执行以下命令,即可安装brew: 介绍brew:是Mac下的一款包管理工具brew [brew install 软件],类似与centos里面的 yum[yum install 软 ...

  6. 51Nod 快速傅里叶变换题集选刷

    打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置 ...

  7. [日常] PKUWC 2018爆零记

    吃枣药丸...先开个坑... day -1 上午周测...大翻车... 下午被查水表说明天必须啥啥啥...(当时我差点笑出声) 晚上领到笔记本一枚和一袋耗材(袜子) 然而班会开太晚回去没来得及收拾就晚 ...

  8. 51Nod 最小公倍数之和V3

    这题公式真tm难推……为了这题费了我一个草稿本…… woc……在51Nod上码LaTeX码了两个多小时…… 一开始码完了前半段,刚码完后半段突然被51Nod吃了,重新码完后半段之后前半段又被吃了,吓得 ...

  9. 51Nod 1815 调查任务

    发现绍一的人很喜欢做51nod,不得不说这还是一个很全能的良心OJ 但是做的这道题就一点都不良心了,简直是毒瘤,调了一早上 首先我们考虑让一条路径的\(a_x\ mod\ a_y\)的值最大,我们简单 ...

随机推荐

  1. [FY20 创新人才班 ASE] 第 1 次作业成绩

    作业概况 条目 备注 作业链接 [ASE高级软件工程]热身作业! 提交人数 19 未完成人数 2 满分 10分 作业情况总结 本次作业作为大家软工课程的第一次作业,完成度相当不错(尤其是在国外暑研/赶 ...

  2. SQLAIchemy(二)ORM 相关

    0. 前言 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 简单的说,ORM是通过使用描述对象和数据库之 ...

  3. 用友U8将存货核算期初单价金额回写到库存管理期初单价金额

    在用友U8及相关产品中,库存管理期初要求必须录入数量,但单价和金额并不是必输的.从本人过去实施经验来看,为了保证ERP产品的快速上线,有不少企业只能先提供库存管理期初数量,而单价金额需要后续才能确定. ...

  4. Github上传项目及更新自己的项目

    更新:请前往下载Github Deskdop,Git命令什么的再也不用啦! 一.首次上传项目 1.在GitHub上创建对应仓库 仓库建立如下: README文件不用勾选,否则初次上传文件就要合并. 2 ...

  5. Maven中的依赖相关总结

    一.Maven的依赖作用域scope compile:编译.测试.运行都会依赖,会打进包中. rumtime:不存于编译,后期运行和测试都会参与,会打进包中. test:只在test classpat ...

  6. git的本质是资源库和版本(资源)目录的维护过程

    仓库的本质: 资源+索引. 对git而言,添加到暂存区的过程是,将单个资源的修改副本保存到资源库,同时维护暂存区目录的过程. git的本质是资源库和版本目录的维护过程. 一.要素 1.资源 2.副本 ...

  7. 使用kibana给不同的用户创建不同的space

    Elastic安全机制 在很多的情况下,出于安全的原因,我们需要对不同的Kibana用户分配不同的用户权限,这样使得他们之间不能互相访问彼此的资源,同 时他们也应该对不同的索引拥有不同的权限,比如读, ...

  8. 2019-11-29-C#-直接创建多个类和使用反射创建类的性能

    原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...

  9. 使用Swagger创建Api

    1.首先创建一个web项目,选择Mvc模板 2.右键点击引用.管理Nuget程序包,浏览 搜索Swagger,下载安装下面的包 3.安装完后在App_Start里面会出现SwaggerConfig.c ...

  10. 读取数据,并以txt格式保存

    /// <summary> /// 读取数据,并以txt格式保存 /// </summary> /// <param name="data">数 ...