比赛链接:https://atcoder.jp/contests/abc170

A - Five Variables

题意

$5$ 个数中有 $1$ 个 $0$,判断是第几个。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++) {
int x; cin >> x;
if (x == 0) {
cout << i << "\n";
return 0;
}
}
}

B - Crane and Turtle

题意

判断是否可能共有 $x$ 只鹤龟,且二者腿数加起来共有 $y$ 条。($1 \le x \le 100, 1 \le y \le 100$)

题解一

枚举二者的数量,时间复杂度 $O_{(n^2)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y; cin >> x >> y;
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
if (i + j == x and 2 * i + 4 * j == y) {
cout << "Yes" << "\n";
return 0;
}
}
}
cout << "No" << "\n";
}

题解二

枚举一者的数量,时间复杂度 $O_{(n)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y; cin >> x >> y;
for (int i = 0; i <= x; i++) {
int j = x - i;
if (2 * i + 4 * j == y) {
cout << "Yes" << "\n";
return 0;
}
}
cout << "No" << "\n";
}

题解三

如果 $y$ 在 $[2x, 4x]$ 之间且 $y$ 为偶数则一定有解,时间复杂度 $O_{(1)}$ 。

证明

鹤龟共有 $x$ 只,假设初始时均为龟,则有 $2x$ 条腿,之后每次可用一只鹤换下一只龟,腿的条数增加 $2$ 条,最多增加 $2x$ 条腿,即至 $4x$,所以 $[2x,4x]$ 间的偶数都是可行的。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y; cin >> x >> y;
cout << (2 * x <= y and y <= 4 * x and y % 2 == 0 ? "Yes" : "No");
}

C - Forbidden List

题意

找出整数集中除 $n$ 个数外与 $x$ 绝对值之差最小的数。($0 \le n \le 100,1 \le p_i \le 100, 1 \le x \le 100$)

题解一

只需构造 $[0,101]$ 即可,每次查询的时间复杂度为 $O_{(n)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int x, n; cin >> x >> n;
set<int> st;
for (int i = 0; i <= 101; i++)
st.insert(i);
for (int i = 0; i < n; i++) {
int t; cin >> t;
st.erase(t);
}
int ans = 0;
int mi = INT_MAX;
for (auto i : st)
if (abs(i - x) < mi)
mi = abs(i - x), ans = i;
cout << ans << "\n";
}

题解二

每次查询的时间复杂度为  $O_{(logn)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int x, n; cin >> x >> n;
set<int> st;
for (int i = 0; i <= 101; i++)
st.insert(i);
for (int i = 0; i < n; i++) {
int t; cin >> t;
st.erase(t);
}
auto it = st.lower_bound(x);
int abs1 = abs(*it - x);
int abs2 = INT_MAX;
if (it != st.begin())
abs2 = abs(*(--it) - x);
cout << (abs1 < abs2 ? x + abs1 : x - abs2);
}

D - Not Divisible

题意

找出 $n$ 个数中有多少个数不被其他数整除。

题解

排序后从小到大筛即可,需要标记已访问元素来优化。

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6; set<int> st;
map<int, bool> repeat, vis; int main() {
int n; cin >> n;
for (int i = 0; i < n; i++) {
int x; cin >> x;
if (st.count(x)) repeat[x] = true;
st.insert(x);
}
int ans = 0;
for (auto i : st) {
if (vis[i]) continue; //重要的优化
for (int j = i + i; j <= MAXN; j += i)
vis[j] = true;
ans += !repeat[i] and !vis[i];
}
cout << ans << "\n";
}

E - Smart Infants

题意

给出 $n$ 个人的分数和初始组别,接下来有 $q$ 个人的调遣,输出每次调遣后所有组最大分数中的最小值。

题解

维护一个最大值集合,需要更新的两种情况:

  • 对于原集合,如果删除元素后为空或余下最大值小于删除元素,更新该集合的最大值。
  • 对于新集合,如果插入元素前为空或已有最大值小于插入元素,更新该集合的最大值。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10; int a[N]; //第i个人的分数
int mp[N]; //第i个人的组别
multiset<int> st[N]; //N个组
multiset<int> st_mx; //最大值集合 int main() {
int n, q; cin >> n >> q;
for (int i = 1; i <= n; i++) {
int a_i, b; cin >> a_i >> b;
st[b].insert(a_i);
mp[i] = b, a[i] = a_i;
}
for (int i = 0; i < N; i++)
if (st[i].size())
st_mx.insert(*st[i].rbegin());
for (int i = 0; i < q; i++) {
int c, d; cin >> c >> d;
st[mp[c]].erase(st[mp[c]].find(a[c]));
if (st[mp[c]].size() == 0) {
st_mx.erase(st_mx.find(a[c]));
} else {
if (*st[mp[c]].rbegin() < a[c]) {
st_mx.erase(st_mx.find(a[c]));
st_mx.insert(*st[mp[c]].rbegin());
}
}
if (st[d].size() == 0 or a[c] > *st[d].rbegin()) {
if (st[d].size())
st_mx.erase(st_mx.find(*st[d].rbegin()));
st_mx.insert(a[c]);
}
st[d].insert(a[c]);
mp[c] = d;
cout << *st_mx.begin() << "\n";
}
}

F - Pond Skater

题意

有一个 $h \times w$ 的迷宫,每次移动最多向同一个方向连续走 $k$ 步,问从 $(x_1, y_1)$ 到 $(x_2, y_2)$ 最少需要移动多少次。

题解

$bfs$ 模拟。

代码

#include <bits/stdc++.h>
using namespace std;
const int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
const int INF = 1e9; int main() {
int h, w, k, x1, y1, x2, y2; cin >> h >> w >> k >> x1 >> y1 >> x2 >> y2;
--x1, --y1, --x2, --y2;
char MP[h][w] = {};
int dis[h][w] = {};
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
cin >> MP[i][j], dis[i][j] = INF;
queue<pair<int, int>> que;
dis[x1][y1] = 0;
que.push({x1, y1});
while (!que.empty()) {
int x = que.front().first;
int y = que.front().second;
que.pop();
for (int i = 0; i < 4; i++) {
int nx = x, ny = y;
int nd = dis[x][y] + 1;
for (int j = 1; j <= k; j++) {
nx += dir[i][0];
ny += dir[i][1];
if (nx < 0 or ny < 0 or nx >= h or ny >= w or MP[nx][ny] == '@' or dis[nx][ny] < nd)
break;
if (dis[nx][ny] > nd) {
dis[nx][ny] = nd;
que.push({nx, ny});
}
}
}
}
int ans = dis[x2][y2];
cout << (ans == INF ? -1 : ans);
}

AtCoder Beginner Contest 170的更多相关文章

  1. AtCoder Beginner Contest 170 D - Not Divisible (数学)

    题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...

  2. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  3. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  4. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  5. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  6. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  7. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  8. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  9. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

随机推荐

  1. vue-vite浅析

    大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...

  2. SonarQube学习(五)- SonarQube之自定义规则使用

    一.前言 古人云:"欲速则不达",最近真的是深有体会.学习也是如此,不是一件着急的事,越是着急越不会. 就拿SonarQube来说吧,去年年末就想学来着,但是想着想着就搁置了,有时 ...

  3. python学习笔记 | 顺序表的常规操作

    ''' @author: 人人都爱小雀斑 @time: 2020/3/11 8:46 @desc: 顺序表的相关操作 ''' class SequenceList: def __init__(self ...

  4. 立完flag,你可能需要对flag进行量化

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  5. P2979 [USACO10JAN]奶酪塔Cheese Towers(完全背包,递推)

    题目描述 Farmer John wants to save some blocks of his cows' delicious Wisconsin cheese varieties in his ...

  6. Web安全之CSRF(跨站请求伪造)

    CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为"CSRF",在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺 ...

  7. ctfhub技能树—sql注入—Refer注入

    手注 查询数据库名 查询数据表名 查询字段名 查询字段信息 脚本(from 阿狸) #! /usr/bin/env python # _*_ coding:utf-8 _*_ url = " ...

  8. k8s集群中遇到etcd集群故障的排查思路

    一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: 1 2 3 4 5 6 7 8 9 10 11 [roo ...

  9. let关键字:加强版的var关键字

    本文首发于个人网站:let关键字:加强版的var关键字 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- let.再说 let 的具体用法之前,大叔想先和你说说大叔自己对 let 的感受 -- ...

  10. IDEA安装codota插件和使用,开发人员的知心伙伴

    打开IDEA 点击左上角的File之后,如下图 成功后如图所示