(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(8)

news2024/10/6 21:27:44

1005 0 vs 1

双端队列暴力模拟,时间复杂度为O(n*T)

首先预处理0的右边第一个0的下标,1的右边第一个1的下标,0的左边第一个0的下标,1的左边第一个1的下标

然后进行模拟

如果当前是zero的轮次,那么就看双端队列的两端

如果两头都是1,那么one赢,如果1头是0,1头是1,那么只能选择0

如果两头都是0,那么我们就要判断选择哪一个0,我们就贪心,想着能快点到达下一个0,所以就比较哪个0到下一个0的距离更近,我们就选择哪一个0,这样的话,首先对于zero来说,可以更快地到达下一个0,同时,掌握了主动权,因为zero选择哪一边,one就得跟着选择哪一边,那么当两边的0到达下一个0的距离相同时,我们就随便选择一边的0就行,因为两头对称,选择哪一头都一样,而且反正主动权在zero手上,zero不管选择哪边,one都只能跟着选同一边

对于one,同理

最后如果都没有输,那么平局,输出-1

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<deque>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+10;
char a[N];
int l1[N],l2[N];//存放0的右边第一个0的下标,以及1的右边第一个1的下标
int r1[N],r2[N];//存放0的左边第一个0的下标,以及1的左边第一个1的下标
int n;
void solve() {
    cin>>n;
    deque<int>q;
    for(int i=1; i<=n; i++) cin>>a[i];

    //预处理
    int x=0,y=0;
    for(int i=1; i<=n; i++) {
        if(a[i]=='0') {
            l1[x]=i;
            x=i;
        } else {
            l2[y]=i;
            y=i;
        }
    }
    x=n+1,y=n+1;
    for(int i=n; i>=1; i--) {
        if(a[i]=='0') {
            r1[x]=i;
            x=i;
        } else {
            r2[y]=i;
            y=i;
        }
    }
//    cout<<"="<<endl;
    for(int i=1; i<=n; i++) q.push_back(i);
    int turn=0;//表示到谁操作了
    while(q.size()) {
        if(turn==0) {
            turn=1;
            if(a[q.front()]=='1'&&a[q.back()]=='1') {
                cout<<1<<endl;
                return;
            } else if(a[q.front()]=='1'||a[q.back()]=='1') {
                if(a[q.front()]=='0') q.pop_front();
                else q.pop_back();
            } else {
                if(l1[q.front()]-q.front()<=q.back()-r1[q.back()]) q.pop_front();
                else q.pop_back();
            }
        } else {
            turn=0;
            if(a[q.front()]=='0'&&a[q.back()]=='0') {
                cout<<0<<endl;
                return;
            } else if(a[q.front()]=='0'||a[q.back()]=='0') {
                if(a[q.front()]=='1') q.pop_front();
                else q.pop_back();
            } else {
                if(l2[q.front()]-q.front()<=q.back()-r2[q.back()]) q.pop_front();
                else q.pop_back();
            }
        }
    }
    cout<<-1<<endl;
    return;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

1007 Solubility

就是n种液体,一共有m种互溶关系,然后判断所给的k种液体是否可以全部互溶

并查集,将有互溶关系的液体放在同一个联通块中,然后判断给定的k种液体是否全部在同一个连通块中

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<deque>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+10;
int p[N];
int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int n,m;
void solve() {
    cin>>n>>m;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        u=find(u),v=find(v);
        if(u!=v) p[u]=v;
    }
    int k;
    cin>>k;
    bool flag=true;
    int x;
    cin>>x;
    int ans=find(x);
    for(int i=1;i<=k-1;i++){
        cin>>x;
        if(find(x)!=ans){
            flag=false;
        }
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

两种错误:

错误1:数有几个节点x满足p[x]==x,那么就有几个连通块,如果n个节点都枚举到,那么是对的,因为枚举到了所有的祖宗节点,但是单单枚举其中的k个节点,这样写是有问题的,因为可能没有枚举到祖宗节点,那么都不会计入连通块的个数

    int k;
    cin>>k;
    int cnt=0;
    for(int i=1;i<=k;i++){
        int x;
        cin>>x;
        if(p[x]==x) cnt++
    }
    if(cnt==1) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;

错误2:写了个break,如果只有一个样例,那么是没问题的,直接输出答案,后面不输入也没有关系,但是有t个样例,如果break了,该样例还未输入的数据可能会用于下一个样例中 

 int k;
    cin>>k;
    bool flag=true;
    int x;
    cin>>x;
    int ans=find(x);
    for(int i=1;i<=k-1;i++){
        cin>>x;
        if(find(x)!=ans){
            flag=false;
            break;
        }
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;

1010 Rikka with Square Numbers

将平方数依次列举出来,发现两两相邻的平方数相减会得到奇数,通过这样的操作,我们可以得到任意的奇数(其中1本身就是平方数)

 

 

然后由于1本身就是平方数,又因为我们可以得到任意一个奇数,故可以通过+1或者-1得到任意一个偶数

令diff为a和b的差的绝对值,然后我们看最少需要几个平方数能凑出n

如果diff本身为平方数,那么操作次数即为1

如果diff可以分解为两个平方数的和,那么操作次数为2

如果diff是4的倍数,就可以分解为两个平方数的差,操作次数为2

如果diff为奇数但又不能分解为两个平方数的和,那么可以通过两个平方数凑出该奇数,那么操作次数为2

如果diff为偶数但又不能分解为两个平方数的和,那么可以通过两个平方数和一个1凑出该偶数,那么操作次数为3

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
int a,b;
bool check(int x){
    int t=(int)sqrt(x);
    if(t*t==x) return true;
    return false;
}
int solve() 
{
    cin>>a>>b;
    int diff=abs(a-b);
    if(check(diff)) return 1;
    for(int i=1;i*i<=diff/2;i++){
        int j=diff-i*i;
        if(check(j)) return 2;
    }
    if(diff%2==1) return 2;
    if(diff%4==0) return 2;
    return 3;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        cout<<solve()<<endl;
    return 0;
}

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

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

相关文章

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布&#xff0c;进行有效的推理和学习&#xff0c;以及解决各种实际问题&#xff0c;如图…

计算机基础概论

一、计算机的组成 1.计算机组成的五大部件 &#xff08;1&#xff09;运算器&#xff1a;也叫算术逻辑单元&#xff0c;完成对数据的各种常规运算&#xff0c;如加减乘除&#xff0c;也包括逻辑运算&#xff0c;位移&#xff0c;比较等。 &#xff08;2&#xff09;控制器&a…

掌握Python的X篇_34_Python朗读文字

各种广告中说python是人工智能的主宰&#xff0c;其实这更多是噱头的成分&#xff0c;但是python确实可以做很多的事情&#xff0c;本篇将会介绍利用pythonAI平台来合成声音。今天将会用到的是百度。 文章目录 1. baiToVoice2. 注册appid3. 合成代码 1. baiToVoice 使用百度A…

详解Mysql——第一篇/连接查询

mysql的连接查询&#xff0c;相必在网上都能找到很多的教程&#xff0c;博主今天不做老话常谈&#xff0c;不走重复路线 1.建表 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编…

ubuntu18.04下配置muduoC++11环境

1.安装muduo依赖的编译工具及库 Cmake sudo apt-get install cmakeBoost sudo apt-get install libboost-dev libboost-test-devcurl、c-ares DNS、google protobuf sudo apt-get install libcurl4-openssl-dev libc-ares-dev sudo apt-get install protobuf-compiler libp…

【单片机毕业设计2-基于stm32c8t6的智能台灯/书桌系统】

【单片机毕业设计2-基于stm32c8t6的智能台灯/书桌系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇2 基于stm32的智能台灯/智能书桌系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖&#xff08;有需可点击…

JavaWeb中Json传参的条件

JavaWeb中我们常用json进行参数传递 对应的注释为RequestBody 但是json传参是有条件的 最主要是你指定的实体类和对应的json参数能否匹配 1.属性和对应的json参数名称对应 2.对应实体类实现了Serializable接口&#xff0c;可以进行序列化和反序列化&#xff0c;这个才是实体类转…

【Minecraft】Fabric Mod开发完整流程4 - 自定义物品方块以及食物、燃料

目录 自定义物品与方块自动侦测矿藏工具工具功能实现执行结果 自定义音乐方块自定义食物自定义燃料 自定义物品与方块 自动侦测矿藏工具 探测器纹理下载地址&#xff1a; https://url.kaupenjoe.net/mbkj57/assets 众所周知&#xff0c;正经人永远不喜欢常规套路挖矿&#xff0…

一种改进的低导通电阻和开关损耗4H-SiC沟槽栅MOSFET

目录 标题&#xff1a;An Improved 4H-SiC Trench-Gate MOSFET With Low ON-Resistance and Switching Loss摘要信息解释ICP-RIELPCVDac电容的串并联 研究了什么文章的创新点文章的研究方法文章的结论 标题&#xff1a;An Improved 4H-SiC Trench-Gate MOSFET With Low ON-Resi…

阿里云账号注册入口_账户注册详细流程(图文)

阿里云账号怎么注册&#xff1f;阿里云账号支持手机号注册、阿里云APP注册、支付宝和钉钉多种注册方式&#xff0c;账号注册后需要通过实名认证才可以购买或使用云产品&#xff0c;阿里云百科来详细说下不同途径注册阿里云账号图文流程&#xff1a; 目录 阿里云账号注册流程 …

考虑分布式电源的配电网无功优化问题研究(Matlab代码实现)

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

ubuntu18.04安装NFS并启动NFS(mount挂载)

首先得把虚拟机网络更改成桥接模式&#xff0c;并把网段设置成与Windows同一网段&#xff0c;可以参考我的这篇博文http://t.csdn.cn/kRmNl ubuntu18.04安装NFS并启动NFS 终端输入指令&#xff1a;sudo apt install nfs-kernel-server 在ubuntu 18.04 下创建一个mount 共享的…

从C语言到C++_32(哈希的应用)位图bitset+布隆过滤器+哈希切割

目录 1. 位图 1.1 位图的概念 1.2 位图的实现 1.3 位图解决海量数据面试题 完整BitSet.h和two_bitset: 1.4 位图的优缺点 2. 布隆过滤器 2.1 布隆过滤器的概念 2.2 布隆过滤器的实现 完整 BloomFilter.h 和测试 2.3 布隆过滤器的优缺点和应用 3. 哈希切割&#xff…

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好&#xff0c;我是风雨无阻。 本文适合人群&#xff1a; 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容&#xff1a; Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

克隆你的声音,只需要你 5 秒钟的语音,就能生成你说出来的任何话,免费开源使用,细思极恐

克隆你的声音,只需要你 5 秒钟的语音,就能生成你说出来的任何话,免费开源使用,细思极恐。可联系作者帮忙部署使用。 Voice Cloning This repository is an implementation of Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis (SV…

AcWing算法提高课-5.1.1哥德巴赫猜想

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 哥德巴赫猜想的内容如下&#xff1a; 任意一个大于 4 4 4 的偶数都可以拆成两个奇素数之和。 例如&#xff1a; 8 3 5 8 3 5 835 20 3 17 7 13 20 3 17 7 13 20317713 …

多线程与高并发--------原子性、可见性、有序性

二、并发编程的三大特性 一、原子性 1.1 什么是并发编程的原子性 JMM&#xff08;Java Memory Model&#xff09;。不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题&#xff0c;用JMM屏蔽掉各种硬件和操作系统带…

腾讯云CVM服务器2核2g1m带宽支持多少人访问?

腾讯云2核2g1m的服务器支持多少人同时访问&#xff1f;2核2g1m云服务器短板是在1M公网带宽上&#xff0c;腾讯云服务器网以网站应用为例&#xff0c;当大规模用户同时访问网站时&#xff0c;很大概率会卡在公网带宽上&#xff0c;所以压根就谈不上2核2G的CPU内存计算性能是否够…

[管理与领导-11]:IT基层管理者 - 目标与落实 - 过程管理失控,结果总难达成的问题思考:如何把过程管控做得更好?

目录 前言&#xff1a; 第1章 问题与现象 1.1 总有意想不到的事发生&#xff1a;意外事件 1.2 总有计划变更&#xff1a;意外影响 1.3 总有一错再错&#xff0c;没有复盘、总结与反思&#xff0c;没有流程与改进 第2章 背后的原因 2.1 缺乏及时的过程检查 - 缺乏异常检测…

机器学习 | Python实现KNN(K近邻)模型实践

机器学习 | Python实现KNN(K近邻)模型实践 目录 机器学习 | Python实现KNN(K近邻)模型实践基本介绍模型原理源码设计学习小结参考资料基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训…