Atcoder beginner contest 302

news2024/5/18 14:27:03

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot +spring security,PasswordEncoder详解与应用

一.简介 在前面的文章有提到过PasswordEncoder: 为什么密码使用{noop}开头呢&#xff1f;也做出了相应的解释&#xff0c;这篇文章了解PasswordEncoder。 二.PassworderEncoder 详解 2.1主要方法 String encode(CharSequence rawPassword)&#xff1a;密码加密boolean matc…

【送书福利-第五期】《网络结构数据分析与应用》

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 送书福利-第五期 1、前言2、内容简介3、作…

CodeForces.1786A1.简单发牌.[简单][flg标识][找数学规律]

题目描述&#xff1a; 题目解读&#xff1a; 简单发牌问题&#xff0c;给两个人发牌&#xff0c;每次发牌数量依次递增&#xff0c; 给a发1张&#xff0c;然后给b发2&#xff0c;3张&#xff1b; 给a发4&#xff0c;5张&#xff0c;给b发6&#xff0c;7张&#xff1b; 给a发…

微信小程序【发送给朋友】和【复制链接】功能,灰色不可用

每日鸡汤&#xff1a;悲观者可能正确&#xff0c;但是乐观者往往成功 假设你是一个用户&#xff0c;你随便找一个小程序可以看到这几个功能 转发给朋友分享到朋友圈复制链接 很常见的功能&#xff0c;但是如果你作为开发者&#xff0c;这几个功能就需要自己做喽&#xff0c;并…

day9 - 对花朵图像进行边缘检测

本期主要介绍常用于进行图像边缘检测的滤波器&#xff08;算子&#xff09;&#xff1a;Sobel算子、Scharr算子、Laplacian算子&#xff1b;通过实验比较不同的算子的处理效果以及使用场景。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像梯度的原理和应用 掌握使用S…

QxRibbon 知:搭建 PyQt5 环境

文章目录 安装 Python安装 PyQt5安装 PyCharm构建 QxRibbon参考资料 安装 Python 参考其它教程 安装 PyQt5 PyQt5 版本&#xff1a;5.15.2 运行 windows cmd.exe 命令提示符&#xff0c;通过下列方法进行安装&#xff08;友情提醒&#xff1a;关闭流氓软件 360&#xff09; …

B站w_rid逆向

文章目录 目标网站加密参数定位算法还原很久没有看过B站的项目了,正好有小伙伴问B站的w_rid咋逆向的, w_rid?初一听没啥印象啊,以前的B站应该没有这个东东,去看了一下,原来是更新了。 就看了下B站pc端作品列表,开始有校验w_rid了,本次目标就是逆向这个参数。 目标网…

Live800在线客服系统:客户体验即是业绩来源

“客户就是上帝”&#xff0c;这一论断在商业行为中早已成为不争的事实。 所有企业都知道&#xff0c;满足客户的需求才能让企业稳步发展。在产品同质化严重的今天&#xff0c;客户服务成为核心竞争力&#xff0c;试想一下&#xff0c;在产品、价格相差无几的两个企业中&#…

网络安全——应用层安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用层安全协议 1.应用层安全威胁 2.电子邮件安全协议 1.MIME协议 2.电…

es 二、核心概念

目录 Nrt cluster集群概念 node节点 Document 文档 Index 索引 Field字段 Type 类型 shard分片 Replica shard副本 数据库和es概念对比 Nrt 写入一秒后就能搜到 cluster集群概念 一台机器启动一个实例即可&#xff0c;多个组成 node节点 一个实例一个节点 Documen…

Hover.css动画库的使用

目录 1、 Hover.css是什么&#xff1f; 2、引入 2.1、整个文件引入 2.2、复制所需要的代码 案例&#xff1a; 1. 卷边效果 2. 调整大小的卷边 类别&#xff1a; 1、 Hover.css是什么&#xff1f; Hover.css是一个CSS3鼠标悬停的动画方案&#xff0c;里面包含了许多纯c…

Linux驱动入门(二)——嵌入式处理器介绍和构建驱动程序开发环境

文章目录 嵌入式处理器和开发板介绍处理器简述处理器种类Intel的PXA系列处理器StrongARM系列处理器MIPS处理器摩托罗拉龙珠(DragonBall)系列处理器日立SH3处理器德州仪器OMAP系列处理器 ARM处理器ARM处理器简介ARM处理器的特点ARM处理器系列ARM处理器的应用ARM处理器选型 STM32…

Netty实战(八)

引导 一、引导1.1 什么是引导1.2 Bootstrap 类1.3 引导客户端和无连接协议1.4 引导客户端1.5 Channel 和 EventLoopGroup 的兼容性 二、引导服务器2.1 ServerBootstrap 类2.2 引导服务器 三、从 Channel 引导客户端四、在引导过程中添加多个 ChannelHandler五、使用 Netty 的 C…

1.实验技术-收藏吃灰去,深入浅出常规PCR

1.PCR 原理与过程 2.PCR 体系组分 3.PCR 应用 4.PCR 常见问题及解决方案 前言 PCR&#xff08;Polymerase Chain Reaction&#xff0c;聚合酶链式反应&#xff09;是现代生物学中一项必不可少的技术&#xff0c;能进行体外扩增DNA序列&#xff0c;为基因组研究和分子诊断提供…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心&#xff1a;IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作&#xff0c;注意&#xff1a;此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

想用Python做副业?看这一篇就够了

大家好&#xff0c;我是耿直。 随着人工智能、大数据、物联网的广泛应用&#xff0c;与之紧密关联的Python技术开始受到人们的极大关注。各行业对Python技术服务的需求量呈指数级暴增&#xff0c;尤以爬虫技术服务为甚&#xff0c;供不应求早已成为常态。 而近两年受到各种不…

Springboot +spring security,实现RememberMe和实现原理分析

一.简介 我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我。 比如下面这个截图&#xff1a; Spring Security 也提供了这个功能&#xff0c;今天来实践下。 二.创建项目 如何创建一个SpringSecurity项目&#xff0…

【精】MySQL5.7没有row_number()函数如何组内排序和求分组topN

当我们遇到一些需求&#xff0c;比如组内分组排序&#xff0c;分组topN等&#xff0c;很容易想到用row_number()函数 ​在MySQL8.0版本中支持row_number函数&#xff0c;本文不做讨论&#xff0c;如果是MySQL5.7版本&#xff0c;要怎么写SQL呢&#xff1f; 测试表&#xff1a;…

Three.js教程:点、线、网格模型介绍

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 点、线、网格模型介绍 经过前面几章学习相信你对点模型Points、线模型Line、网格模型Mesh已经有了大致了解&#xff0c;本节课就对点、线、网格模型模型进行简单总结。 点模型…

阿里大佬随手甩出一份覆盖全网的微服务架构笔记,让我涨薪60%

在这个凡事皆互联的时代&#xff0c;越来越多的人和物成为互联网上的节点&#xff0c;不断扩充着互联网这张大网的边界。节点即价值&#xff0c;更多的节点意味着更大的价值。 微服务在这个互联网时代依旧是最火热的技术之一&#xff0c;在当下互联网企业不懂微服务是不行的&a…