2023牛客暑期多校训练营3

news2024/7/4 6:28:44

A.World Fragments I

将两个二进制数先转换成十进制数,因为只要二进制中有1,就加或减1(加减0是没有用的),所以求两个二进制的差的绝对值(这是在有1的情况下,其实只要不等于0就有1,数是非负整数)

所以需要特判,如果第一个二进制数为0,第二个二进制数不为0,那么就不能转化,输出-1

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
typedef pair<int,int>PII;
typedef long long ll;
void solve()
{
    string x,y;
    cin>>x>>y;
    ll nx=x.size();
    ll ny=y.size();
    ll xx=0;
    ll yy=0;
    ll cnt1=0;
    ll cnt2=0;
    if(x=="0"&&y!="0"){
        cout<<-1<<endl;
        return;
    }
    for(int i=0;i<nx;i++){
        if(x[i]=='1') {
            cnt1++;
            xx+=(1ll<<(nx-i-1));
        }
     }
     for(int i=0;i<ny;i++){
        if(y[i]=='1') {
            cnt2++;
            yy+=(1ll<<(ny-i-1));
        }
     }
     if(xx<=yy) cout<<yy-xx<<endl;
     else cout<<xx-yy<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

D.Ama no Jaku 

首先,得将整个矩阵全部都变成0或者全部都变成1才行

证明如下:

因为题目的要求是最小的一行要大于等于最大的一列

假设最小的一行是0101,转化成十进制是5,那么其它的行都得大于等于5,所以x1和y1位置中至少有一个1,同理,x2和y2位置中至少有一个1

 

有以下几种情况: 

 

会发现,均不满足最小的行大于等于最大的列,所以只有一种情况能满足,就是将所有都变成1或者将所有都变成0

我们首先输入第一行字符串a,然后依次输入接下来的字符串b,如果字符串b要么和字符串a完全相同,要么完全相反,否则是不可能将全部都转化成0或全部都转化成1的

cnt1记录有几个字符串和a完全相反,cnt2记录字符串a中有一个字符和a[0]不一样

然后先将所有行都变得一样,操作次数为cnt1或者n-cnt1,取小的那个就行

然后将所有列都变得一样,操作次数为cnt2或者n-cnt2,取小的那个就行

最后将两者加起来

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
//typedef pair<int,int>PII;
//typedef long long ll;
void solve()
{
    int n;
    cin>>n;
    string a,b;
    cin>>a;
    int cnt1=0;
    int cnt2=0;
    for(int i=2;i<=n;i++){
        cin>>b;
        if(a[0]==b[0]){
            for(int j=1;j<n;j++){
                if(a[j]!=b[j]){
                    cout<<-1<<endl;
                    return;
                }
            }
        }
        else{
            cnt1++;
            for(int j=1;j<n;j++){
                if(a[j]==b[j]){
                    cout<<-1<<endl;
                    return;
                }
            }
        }
    }
    for(int i=1;i<n;i++){
        if(a[0]!=a[i]) cnt2++;
    }
    cout<<min(cnt1,n-cnt1)+min(cnt2,n-cnt2)<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

H.Until the Blue Moon Rises 

每次都选择两个数,一个加1,一个减1,需要将所有数都变成质数,因为一个数加1一个数减1,所以操作完之后所有数的和不变,所以该题就转化成了先求出n个数的和x,问x能否分解成n个质数

哥德巴赫猜想:任意一个大于2的偶数都可以分成两个质数之和

假如是n个数的和为x 

当n大于等于3时(为什么要大于等于3呢?当n为偶数时,先分成一个2,再将剩下的偶数分成2个质数.当n为奇数时,先分成一个3,再将剩下的偶数分成两个质数) 

对于一个大于等于2*n的偶数x,可以先将其分解成n-2个2,然后剩下的偶数大于等于4(满足大于2),所以根据哥德巴赫猜想,一定可以将剩余的偶数分解成两个质数

对于一个大于等于2*n的奇数,可以先将其分解成n-3个2,以及1个3,然后剩下一个大于等于4的偶数,同上,可以分解成两个质数

因此还需要特判n等于1以及n等于2的情况

当n等于1时,只需要判断是否是质数就行了

当n等于2时,设两数之和为x,当x为偶数并且x大于等于2*n即4时,可以分解成两个质数之和,当x为奇数时,由于质数中除了2其它全部都是奇数,也就是说只有其中一个质数是2,两个质数之和才有可能是奇数,所以只需要判断x-2是否是质数就行

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
const int N=1010;
const string yes= "Yes";
const string no = "No";
int a[N];
int n;
bool check(int x){
    if(x<2) return false;
    for(int i=2;i<=x/i;i++){
        if(x%i==0) return false;
    }
    return true;
}
//typedef pair<int,int>PII;
//typedef long long ll;
string solve()
{
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        sum+=a[i];
    }
    if(n==1){
        if(check(sum)) return yes;
        return no;
    }
    if(n==2){    
        if(sum<n*2) return no;
        if(sum%2==0) return yes;
         if(check(sum-2)) return yes;
        return no;
    }
    if(sum<2*n) return no;
    return yes;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    cout<<solve()<<endl;
    return 0;
}

J.Fine Logic 

拓扑排序

赢的人排在前面,然后要求输出最小数量的排行榜,对于任意的i,j,他们的输赢关系能在排行榜中找到

如果没有环的话,就只需要一个排行榜,直接输出拓扑排序即可

如果有环的话,一个排行榜是不够的,还需要一个排行榜,即总共需要两个排行榜,第一个排行榜从1输出到n,第二个排行榜从n输出到1即可,这样就可以满足所有的输赢关系都能在排行榜中找到,因为这样的两个排行榜对于任意的i,j,既有i赢j,也有j赢i

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
int n,m;
const int N=1e6+10;
int d[N];
vector<vector<int>>e(N);
//typedef pair<int,int>PII;
//typedef long long ll;
void solve()
{
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        d[v]++;//入度加1
    }
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(!d[i]) q.push(i);
     }
     vector<int>ans;
     while(q.size()){
         int t=q.front();
         q.pop();
         ans.push_back(t);
         for(auto v:e[t]){
             d[v]--;
             if(!d[v]) q.push(v);
         }
     }
  //如果答案数量小于n,说明里面有环,有环的话就有点入度不是0,那么就不会放入答案,所以答案数量小于n
     if(ans.size()<n){
         cout<<2<<endl;
         for(int i=1;i<=n;i++) cout<<i<<" ";
         cout<<endl;
         for(int i=n;i>=1;i--) cout<<i<<" ";
         cout<<endl;
     }
     else{
         cout<<1<<endl;
         for(auto v:ans) cout<<v<<" ";
         cout<<endl;
     }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

E.koraidon and DFS Shortest Path 

只要dfs到的点算出的距离不是最短距离,那么dfs算法就错误

可以转化成用dfs搜一遍,如果从不同的路搜到某一点,它们的距离是不一样的,那么说明算法错误

vis用于标记该点是都被搜过,保证一条路上的点只会搜一遍

 

1==>2==>3,然后1已经被标记过了,所以不会再搜到1

然后每次dfs完之后都要恢复现场,避免以下这种情况

 

比如说我们一开始搜1==>2==>3==>5,然后如果不将3和5恢复现场的,就不能搜1==>3==>5这条路了

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
//typedef pair<int,int>PII;
typedef long long ll;
const int N=1e6+10;
int a[N];
bool flag;
int n,m;
int vis[N],dist[N];
vector<vector<int>>e(N);
void dfs(int k)
{
    if(!flag) return;
    vis[k]=1;
    for(auto kk:e[k]){
        if(vis[kk]) continue;
        if(!dist[kk]) dist[kk]=dist[k]+1;
        else if(dist[kk]!=dist[k]+1) flag=false;
        dfs(kk);
    }
    vis[k]=0;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        e[i].clear();
        vis[i]=dist[i]=0;
    }
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
    }
    flag=true;
    dfs(1);
    if(flag) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
    solve();
    return 0;
}

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

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

相关文章

甄云质量管理解决方案——插上数字“羽翼”,实现PPAP落地

导语 质量管理是供应链管理中非常重要的一环&#xff0c;通过制定和开展质量相关的活动&#xff0c;确保产品符合质量标准和一致性要求。质量管理水平的高低直接影响供应链的整体效率和最终效益&#xff0c;关乎企业形象和品牌声誉&#xff0c;已然是企业的生命线。 作为采购…

Redis超详细入门教程(基础篇)

目录 一、什么是Redis 二、安装Redis 1、Windows系统安装 2、Linux系统安装 三、Redis通用命令 四、Redis基本命令 五、五种数据结构类型 5.1、String类型 5.2、List集合类型 5.3、Set集合类型 5.4、Hash集合类型 5.5、Zset有序集合类型 六、总结 一、什么是Redi…

leecode 98验证二叉搜索树

​​​​ 这次的性能真的是超乎想象的好 题目描述 98二叉树 第一种方法 中序遍历 大体的思想就是将遍历的结果存放到数组中 检查数组是否是有序 判断是否符合条件 特点是时间和空间消耗都很大 /*** Definition for a binary tree node.* struct TreeNode {* int val;*…

常见面试题之设计模式--工厂方法模式

1. 概述 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设计一个咖啡店类&#xff08;CoffeeStore&…

DAY51:动态规划(十五)买卖股票最佳时机Ⅲ+买卖股票最佳时期Ⅳ

文章目录 123.买卖股票最佳时机Ⅲ&#xff08;注意初始化&#xff09;思路DP数组含义递推公式初始化遍历顺序最开始的写法&#xff1a;初始化全部写成0debug测试&#xff1a;解答错误&#xff0c;第0天实际上是对应prices[0]和dp[0] 完整版总结 188.买卖股票最佳时机Ⅳ思路DP数…

【wxWidgets】剪贴板和拖放操作

【wxWidgets】剪贴板和拖放操作 使用剪贴板传输数据时应用程序间的一种交互方式 剪贴板和拖放操作在wxWidgets中共享了一些类来实现数据的传输 数据对象 wxDataObject类时剪贴板操作和拖放操作的核心&#xff0c;该类实例代表了拖放操作中鼠标拖拽的事物和剪贴板中拷贝和粘贴…

【git学习2】多人合作中git的使用

提交代码 中间打勾&#xff1a;commit提交代码 最后点击向上的箭头 push到远程仓库。 团队开发中git的使用 第一步先从远程仓库中某个分支拉下来代码&#xff0c;比如下图只有一个分支master 新建文件夹&#xff0c;存放这个拉下来的项目&#xff0c;克隆项目地址&#xff…

JDK8版本接口的改进(heima)

JDK8版本接口的改进&#xff08;heima&#xff09; public class InterfaceTest1 {/*JDK8版本接口改进1.允许编写带有方法体的方法&#xff08;默认方法&#xff09;2.允许编写静态方法目的&#xff1a;解决接口的升级问题---------------------------------------注意事项&…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

基本数据类型和引用数据类型

数据类型的分类 java中的 变量 按照数据类型来分类&#xff1a; Java语言是 强 类型语言&#xff0c;对于每一种数据都给出了明确的数据类型&#xff0c;不同的数据类型也分配了不同的内存空间&#xff0c;所以它们表示的数据大小也是不一样的。基本数据类型&#xff08;4类8种…

[Python] flask运行+wsgi切换生产环境+supervisor配置指南

文章目录 问题背景flask启动方式1&#xff08;编写main函数&#xff09;&#xff1a;方式2&#xff08;编译器&#xff09;&#xff1a;方式3&#xff08;命令行&#xff09;&#xff1a;方法4&#xff08;重命名文件法&#xff09;&#xff1a;方法5&#xff08;使用flask命令…

欧盟新规,燃油噩梦?2025年起,高速公路每60公里设立一处快充站

根据外媒The Verge报道&#xff0c;欧洲电动汽车用户将获得更多便捷的待遇&#xff0c;同时还能减少有害温室气体排放&#xff0c;这得益于欧盟理事会最新通过的法规。 根据欧盟的法规要求&#xff0c;自2025年起&#xff0c;TEN-T高速公路系统在欧洲将需要每隔60公里设立一座高…

WEB:ics-07

背景知识 php弱类型 文件上传漏洞 一句话木马 floatval函数 题目 点击项目管理 点击查看源代码&#xff0c;发泄一个view-source.php 访问该网页 进行代码审计 <?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) &…

ant design vue a-table表格中插入操作按钮(以switch开关 [a-switch]为例)

1.给columns添加列属性 columns() {sortedInfo sortedInfo || {};return [{title: "工程",dataIndex: "outputProject",width: 80},{title: "是否显示小数",dataIndex: "showDecimalsOrnot",width: 80,scopedSlots: { customRender:…

页面设计—FixedContainer固定容器组件详解

一、组件介绍 可任意拖动位置&#xff0c;脱离文档流布局&#xff0c;生成绝对定位的元素 二、如何使用 1、找到FixedContainer组件&#xff0c;拖放到页面位置。 2、设置是否拖动&#xff0c;设置高级样式&#xff0c;也可以在自定义样式里编写css样式 操作步骤如下&…

IO进程线程,标准IO函数

一、什么是IO I&#xff1a;input --->输入&#xff0c;从外部存储设备将数据输入到内存中。 O&#xff1a;output --->输出&#xff0c;数据从内存到外部存储设备。 总结&#xff1a;输入输出就是数据从外存到内存&#xff0c;内存到外存的流向。 二、IO分类 1. 文件…

Arcgis之 KML/KMZ文件转shp

一般我们在Goole Earth上勾画的区域导出后都为KML或者KMZ格式的&#xff0c;但无法在arcgis等软件上直接应用&#xff0c;故需进行一定的转换 1.打开ArcMap&#xff0c;选择ArcToolbox->Conversion Tools->From KML->KML To Layer 得到如下结果&#xff08;由于本KML…

三菱PLC 流水灯控制

方式一思路&#xff1a;每一秒让计数器 C0 的值加一&#xff0c;然后将 C0 对应的值赋值给输出灯 Y10 - Y15。 方式二思路&#xff1a;每一秒让寄存器 D0 的值向左移1位&#xff0c;然后使用组合位元件将 D0 的低八位值传送给输出灯 Y10 - Y17。 后面有更好的思路再来增加。

【Ajax】笔记-使用fetch函数发送AJAX请求

fetch()函数说明与使用方法详解 fetch()是XMLHttpRequest的升级版,用于在JavaScript脚本里面发出 HTTP请求,本文章向大家介绍fetch()的用法,主要包括fetch()的用法使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参…

S-NER: A Concise and Efficient Span-Based Model for NamedEntity Recognition

原文链接&#xff1a;Sensors | Free Full-Text | S-NER: A Concise and Efficient Span-Based Model for Named Entity Recognition Sensors 2022 介绍 NER中的序列标注模型使用条件随机场&#xff08;CRF&#xff09;来获取标签之间的依赖性&#xff0c;存在误差传播的问题&a…