Atcoder beginner contest 302

A - Attack

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long 
using namespace std;
signed main()
{
    int a, b;
    cin >> a >> b;
    if (a % b == 0) cout << a / b << endl;
    else cout << a / b + 1 << endl;
}

B - Find snuke 

 

就是按顺序找到s,n,u,k,e(水平或竖直或对角线)

模拟呗,先找到s再去判断,题目说只有唯一一组满足,那么就枚举所有的s,去找到一组符合要求的s,n,u,k,e

注意:别忘了对角线有两条,主对角线和副对角线,当时做的时候就考虑了主对角线导致没有AC 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 500;
struct node
{
    string s;
}q[N];
int main()
{
    int h, w;
    cin >> h >> w;
    for (int i = 0; i < h; i++) cin >> q[i].s;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            if (q[i].s[j] == 's') {
                //水平往左
                if (j - 4 >= 0) {
                    if (q[i].s[j - 1] == 'n' && q[i].s[j - 2] == 'u' && q[i].s[j - 3] == 'k' && q[i].s[j - 4] == 'e') {
                        for (int k = j; k >= j - 4; k--) cout << i+1 << " " << k+1 << endl;
                        return 0;
                    }
                }
                //水平往右
                if (j + 4 < w) {
                    if (q[i].s[j + 1] == 'n' && q[i].s[j + 2] == 'u' && q[i].s[j +3] == 'k' && q[i].s[j + 4] == 'e') {
                        for (int k = j; k <= j + 4; k++) cout << i+1 << " " << k+1 << endl;
                        return 0;
                    }
                }
                //竖直向上
                if (i - 4 >= 0) {
                    if (q[i-1].s[j] == 'n' && q[i-2].s[j] == 'u' && q[i-3].s[j] == 'k' && q[i-4].s[j] == 'e') {
                        for (int k = i; k >= i -4; k--) cout << k+1 << " " << j+1 << endl;
                        return 0;
                    }
                }
                //竖直向下
                if (i +4 <h) {
                    if (q[i + 1].s[j] == 'n' && q[i + 2].s[j] == 'u' && q[i + 3].s[j] == 'k' && q[i +4].s[j] == 'e') {
                        for (int k = i; k <= i + 4; k++) cout << k+1 << " " << j+1 << endl;
                        return 0;
                    }
                }
                //向左上
                if (i - 4 >=0&&j-4>=0) {
                    if (q[i -1].s[j-1] == 'n' && q[i- 2].s[j-2] == 'u' && q[i - 3].s[j-3] == 'k' && q[i - 4].s[j-4] == 'e') {
                        for (int k = 0; k <=4; k++) cout << i-k+1 << " " << j-k+1 << endl;
                        return 0;
                    }
                }
                //向右下
                if (i + 4 <h && j + 4 <w) {
                    if (q[i + 1].s[j + 1] == 'n' && q[i + 2].s[j + 2] == 'u' && q[i + 3].s[j + 3] == 'k' && q[i+ 4].s[j + 4] == 'e') {
                        for (int k = 0; k <= 4; k++) cout << i + k + 1 << " " << j + k + 1 << endl;
                        return 0;
                    }
                }
                //向左下
                if (i +4 <h && j - 4 >= 0) {
                    if (q[i + 1].s[j - 1] == 'n' && q[i + 2].s[j - 2] == 'u' && q[i + 3].s[j - 3] == 'k' && q[i + 4].s[j - 4] == 'e') {
                        for (int k = 0; k <= 4; k++) cout << i + k + 1 << " " << j - k + 1 << endl;
                        return 0;
                    }
                }
                //向右上
                if (i - 4 >= 0 && j + 4 <w) {
                    if (q[i - 1].s[j + 1] == 'n' && q[i - 2].s[j + 2] == 'u' && q[i - 3].s[j + 3] == 'k' && q[i - 4].s[j + 4] == 'e') {
                        for (int k = 0; k <= 4; k++) cout << i - k + 1 << " " << j + k + 1 << endl;
                        return 0;
                    }
                }
            }
        }
    }
    return 0;
}

 C - Almost Equal

大致题意就是n个长度相等的字符串,通过排列它们的顺序,使得所有两两相邻的字符串只有一个字符是不相同的,若可以输出Yes,否则输出No

最多只有8个字符串,可以进行一个dfs,枚举出所有的情况,若能够满足一种的话就输出Yes

类似于蓝桥杯第十届的题目组队,具体见第十届蓝桥杯c++b组_m0_74087709的博客-CSDN博客 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 50;
struct node {
    string s;
}q[N];
int n, m;
bool flag[N];
int st[N];
bool flag1;
int cnt1;
void dfs(int x)
{
    if (x <= n) {
        for (int i = 0; i < n; i++) {
            if (!flag[i]) {
                st[x] = i;
                flag[i] = true;
                dfs(x + 1);
                flag[i] = false;
            }
        }
    }
    else {
        flag1 = true;
        int cnt;
        for (int i = 1; i <= n - 1; i++) {
            cnt = 0;
            for (int j = 0; j < m; j++)
                if (q[st[i]].s[j] != q[st[i + 1]].s[j]) cnt++;
            //cout << cnt << endl;
            if (cnt != 1) {
                flag1 = false;
                break;
            }
        }
        if (flag1) {
            cnt1++;
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> q[i].s;
    dfs(1);
    //cout << cnt1 << endl;
    if (cnt1) puts("Yes");
    else puts("No");
    return 0;
}

D - Impartial Gift 

大致题意就是从N个礼物中选择一个礼物给Aoki,从M个礼物中选择一个礼物给Snuke,每个礼物都有相应的价值,求选择的两个礼物的差的绝对值小于等于D,求出它们总和价值的最大值,如果都不能满足差的绝对值小于等于D,就先输出-1

首先,任意选择,和顺序无关,那么可以先排个序,从小到大排序

1 3 3

2 6 7

可以用双指针,对于指针i,j,哪一个指针指的数小,就让另一个指针往右移动,如果大的指针移动不了,就将小的指针往右移动一格,要使得总和价值最大,那么肯定往右走,不会往左退的,每次res都取最大值

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long 
using namespace std;
const int N = 2e5 + 10;
int a[N], b[N];
signed main()
{
    int n, m, d;
    cin >> n >> m >> d;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];
    sort(a, a + n);
    sort(b, b + m);
    int res = -1;
    int i = 0;
    int j = 0;
    if (abs(a[0] - b[0]) <= d) res = a[0] + b[0];
    while (i < n && j < m) {
        if (a[i] < b[j]) {
            if (abs(a[i] - b[j+1]) <= d&&j+1<m) j++;
            else i++;
        }
        else {
            if (abs(a[i+1] - b[j]) <= d&&i+1<n) i++;
            else j++;
        }
        //cout << a[i] + b[j] << endl;
        if (abs(a[i] - b[j]) <= d) res = max(res, a[i] + b[j]);
    }
    cout << res << endl;
}

E - Isolation 

大致题意就是有N个点,有q次操作,每次操作要么在两个点之间连一条边,要么删掉一个点的所有边(点不删掉,那么该点就变成孤立点了),对于每一次操作,输出有多少个点是孤立的

核心在于一共有n个点,然后若知道有几个点是连了边的,用n减去其就可以了

那么如何判断该点是连了边还是没有连边呢?通过操作来看,如果是连边操作,那么将这两个点都标记为true,在标记之前,如果它们为false的话,那么就cnt++,表示连了边的点的个数;

如果是删边操作,那么将该点标记为false,在标记之前,如果它为true,那么cnt--

每次输出n-cnt

试了一下之后,发现思路错误,因为如果一开始只有2,3连了边,那么孤立点有1个,删掉2的边之后,孤立点变成了3个,所以删除2的边操作不能只删除一次

那么问题在于删了一个点的边之后,到底还有几个孤立点

 错误代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 3e5 + 10;
int cnt;
bool flag[N];
int main()
{
    int n, q;
    cin >> n >> q;
    while (q--) {
        int x;
        cin >> x;
        if (x == 1) {
            int u, v;
            cin >> u >> v;
            if (!flag[u]) {
                cnt++;
                flag[u] = true;
            }
            if (!flag[v]) {
                cnt++;
                flag[v] = true;
            }
        }
        else {
            int y;
            cin >> y;
            if (flag[y]) {
                cnt--;
                flag[y] = false;
            }
        }
        cout << n - cnt << endl;
    }
    return 0;
}

可以用set连边,若用数组模拟的话不好删边 

 AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int N = 3e5 + 10;
int n, q;
int op, u, v;
set<int>g[N];
int main()
{
    cin >> n >> q;
    int res = n;
    while (q--) {
        cin >> op;
        if (op == 1) {
            cin >> u >> v;
            //如果在连边操作之前,点的边数为0的话,那么说明之前该点是孤立点,但是连边之后就不是了,则孤立点数减1
            if (!g[u].size()) res--;
            if (!g[v].size()) res--;
           //将u,v两个点连起来
            g[u].insert(v);
            g[v].insert(u);
        }
        else {
            cin >> v;
            //利用x遍历并获得v容器中的每一个值,即x表示点v所连的点
            for (auto x : g[v]) {
                g[x].erase(v);//对于点x,把点v与x之间的边删掉
                if (!g[x].size()) res++;//如果删边操作后,点x的边数为0,那么孤立点数+1
            }
            if (g[v].size()) res++;//在删边操作之前,如果点v的边数不为0,那么孤立点+1
            g[v].clear();//删除点v的所有边,清空操作
        }
        cout << res << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

加密与解密 调试篇 动态调试技术 (二)

目录 常见的断点 1.INT 3 断点 检测 绕过 2.硬件断点 原理 我们给出硬件中断的例子 删除硬件断点 3.内存断点 原理 例子 删除 区别 总结 4.内存访问一次性断点 5.消息断点 例子 删除 6.条件断点 &#xff08;1&#xff09;按寄存器条件中断 &#xff08;2&…

【JDK】一、jdk17的下载与安装配置(图文说明超详细)

JDK17的下载与安装 前言一、JDK17下载1、官方下载地址 &#xff08; Oracle中国的官方网站&#xff09; 二、JDK17安装1、先看一下我现在的java版本和环境变量2、开始新的安装第一步&#xff1a;双击下载的jdk-17.0.7_windows-x64_bin.exe 进入到安装页面第二步&#xff1a;jdk…

sqlmap命令大全(附详细扫描流程)

一、sqlmap命令大全。 -u 指定目标URL (可以是http协议也可以是https协议)-d 连接数据库--dbs 列出所有的数据库--current-db 列出当前数据库--tables 列出当前的表--columns 列出当前的列-D 选择使用哪个数据库-T 选择使用哪个表-C 选择使用哪个列--dump 获取字段中的数据--…

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户&#xff0c;你作为root管理员&#xff0c;想知道它的密码&#xff0c;又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式&#xff0c;MYSQL 4.1版本之…

《Spring Guides系列学习》guide6 - guide10

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

【源码解析】流控框架Sentinel源码深度解析

前言 前面写了一篇Sentinel的源码解析&#xff0c;主要侧重点在于Sentinel流程的运转原理。流控框架Sentinel源码解析&#xff0c;侧重点在整个流程。该篇文章将对里面的细节做深入剖析。 统计数据 StatisticSlot用来统计节点访问次数 SpiOrder(-7000) public class Statis…

跨时钟域数据同步

跨时钟信号直接传输在信号跳变时违背本地时钟域的时序要求&#xff08;建立时间约束&#xff0c;保持时间约束&#xff09;&#xff0c;容易产生亚稳态&#xff0c;无法确定亚稳态何时结束以及结束时保持在何种状态上。 用同步器抑制亚稳态的往下传播的概率&#xff0c;根据情…

H3C IPSec IKE野蛮模式

这里使用H3C模拟器。 H3C IPSec IKE野蛮模式&#xff0c;又称为IKE Main Mode&#xff0c;主要是在第一阶段&#xff08;Phase 1&#xff09;的过程中提供身份保护。它主要用于VPN隧道建立过程中的密钥交换。以下是配置步骤&#xff1a; 创建IKE提案&#xff1a; system-view…

QT圆形进度条(QT桌面项目光照强度检测)

文章目录 前言一、编程思路二、核心代码实现总结 前言 本篇文章我们讲解QT实现圆形进度条&#xff0c;并实现动态的效果。 一、编程思路 实现QT圆形进度条其实是非常简单的&#xff0c;思路就是画两个圆弧。 这里大家就会觉得很奇怪了为什么画两个圆弧就能实现圆形进度条了呢…

轻NAS搭建 - 使用微力同步搭建私人云盘,无需公网IP也能远程访问

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

华为OD机试之不含101的整数(Java源码)

不含101的数 题目描述 小明在学习二进制时&#xff0c;发现了一类不含 101的数&#xff0c;也就是&#xff1a; 将数字用二进制表示&#xff0c;不能出现 101 。 现在给定一个整数区间 [l,r] &#xff0c;请问这个区间包含了多少个二进制不含 101 的整数&#xff1f; 输入描述…

2023全球最佳医院榜单及简要介绍

作为医学类的访问学者、博士后及联合培养博士们&#xff0c;都希望到世界知名医院进行临床研修交流及科研学习。2023 年世界最佳医院排行榜的发布为申请者提供了目标平台&#xff0c;现知识人网小编整理刊出。 近期&#xff0c;《新闻周刊》和全球数据公司 Statista 推出了2023…

Vue之MVVM模型

文章目录 前言一、简说MVVM模型二、走进MVVM总结 前言 Vue的创建者在创建Vue时没有完全遵守MVVM&#xff08;一种软件架构模式&#xff09;&#xff0c;但是Vue的设计受到了他它的启发。这也是为什么经常用vm&#xff08;ViewModel的缩写&#xff09;这个变量名表示Vue实例。 …

操作系统第三章——内存管理(中)

九月重楼二两&#xff0c;冬至蝉蜕一钱&#xff0c;煎入隔年雪煮沸&#xff0c;可治人间相思苦疾&#xff0c; 可是&#xff0c;重楼七叶一花&#xff0c;冬日何来蝉蜕&#xff0c;原是相思无解 殊不知 夏枯即为九叶重楼&#xff0c;掘地三尺寒蝉现&#xff0c;除夕子时雪&…

non-protected broadcast场景分析及解决

non-protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver&#xff0c;有时在运行过程中在logcat工具中会发现大片的飘红消息。 要消除这些错误信息&#xff0c;需要在广播的 Sender 和 Receiver 做部分的修改。 错误信息分析 由于 发送端 的 M…

`JOB`的正确打开方式

文章目录 JOB的正确打开方式 简介工作原理使用场景使用方式注意事项启动JOB失败的情况JOB正确打开方式错误方式正确方式进阶方式终极方式 总结 JOB的正确打开方式 最近有一些小伙伴在使用JOB时&#xff0c;由于使用不当&#xff0c;引起一些问题。例如把license占满&#xff0c…

操作系统第四章——文件管理(下)

竹本无心&#xff0c;却节外生枝&#xff0c;藕却有孔&#xff0c;但出淤泥而不染&#xff0c;人生如梦&#xff0c;却却不随人愿&#xff0c;万般皆是命&#xff0c;半点不由人 文章目录 4.1.5 逻辑结构VS物理结构4.1.6 文件的基本操作知识总览创建文件删除文件打开文件关闭文…

【弹性分布式EMA】在智能电网中DoS攻击和虚假数据注入攻击(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

GPC_APDU_Transport_over_SPI-I2C_v1.0_PublicRelease

GPC_APDU_Transport_over_SPI-I2C_v1.0_PublicRelease.pdf 目录 1 简介 越来越多的设备&#xff0c;如移动设备、可穿戴设备或其他 IoT&#xff08;物联网&#xff09;设备现在正在使用焊接安全元件 (SE)。 这产生了支持 SPI 或 I2C 等物理接口的新需求&#xff0c;以代替以前…

Java 反序列化漏洞

反序列化漏洞是指程序在反序列化期间&#xff0c;通过特殊的调用链引发的一系列安全问题。编程语言中只要存在序列化&#xff0c;反序列化功能就可能存在反序列化的安全问题。这里只针对Java和PHP进行讨论。 序列化漏洞概述 序列化的存在主要是为了存储和传输&#xff0c;将这…