2023河南萌新联赛第(一)场:河南农业大学

2023-11-06

2023河南萌新联赛第(一)场:河南农业大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

C.硬币游戏

考察知识点:博弈

先说结论:若操作一次就能获胜则先手胜,若无论第一次怎么操作,第二次操作都能获胜则后手胜,否则平局

证明:对于上述结论中先手胜和后手胜的局面显而易见,无需证明,对于平局:处于劣势的一方,无论对手怎么操作,只需要复制对手的操作即可保证自己不会输掉,对于此时的另一方,无论怎么操作自己永远也不可能获胜,同时也可以按照上述操作保证自己不会输掉,所以一定会平局

判断一下即可,时间复杂度O(n)

所以只需要找出能够判断胜负的情况即可,其它情况都是平局

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<vector>
using namespace std;
void solve()
{
    int n,k;
    cin>>n>>k;
    string s;
    cin>>s;
    int cnt=1;
    vector<int>pos;
    for(int i=1;i<s.size();i++){
        if(s[i]==s[i-1]) cnt++;
        else {
            pos.push_back(cnt);
            cnt=1;
        }
    }
    if(cnt) pos.push_back(cnt);
    if(pos.size()==1&&pos[0]<=k) puts("Alice");
    else if(pos.size()==1&&pos[0]>k) puts("Bob");
    else if(pos.size()==2&&(pos[0]<=k||pos[1]<=k)) puts("Alice");
    else if(pos.size()==3&&pos[1]<=k) puts("Alice");
    else if(s == "0101" || s == "1010" || s == "1100" || s == "0110" || s == "0011" || s == "1001") puts("Bob");
    else cout<<":(\n";
}
int main()
{
    solve();
    return 0;
}

D.松鼠回家

使得路径上扣除松果的数量最大的那个点扣除的数量尽可能小,想到用二分来寻找答案,如果用二分得到的数满足的话,就继续往小了找,如果不满足的话,就往大了找

路上所消耗的体力就和边权值是一个意思

对于每一个二分的答案,判断它是否合法,在保证其合法的情况下,找一条体力值尽可能小的路(最短路,这样体力值才能小于h)

用bfs求最短路,如果遇到更短的路径并且去的那个点要扣除的松果小于等于二分得到的数,那么就更新最短路径

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=1e4+10;
int a[N];//扣除松果数量
int n,m,st,ed,h;
vector<PII>e[N];
int dist[N],vis[N];
bool bfs(int x)
{
    memset(dist,0x3f,sizeof dist);
    memset(vis,0,sizeof vis);
    priority_queue<PII,vector<PII>,greater<PII>>heap;
    dist[st]=0;
    heap.push({0,st});//把起点放进去
    while(heap.size()){
      auto t=heap.top();
      int d=t.first,ver=t.second;
      heap.pop();
      if(vis[ver]) continue;
       vis[ver]=1;
       for(auto v:e[ver]){
           int y=v.first,z=v.second;
        if(dist[y]>dist[ver]+z&&a[y]<=x){
            dist[y]=dist[ver]+z;
            heap.push({dist[y],y});
        }
     }
    }
    if(dist[ed]<=h) return true;
    return false;
}
void solve()
{
    cin>>n>>m>>st>>ed>>h;
    for(int i=1;i<=n;i++) cin>>a[i];
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        e[x].push_back({y,z});
        e[y].push_back({x,z});
    }
    int l=1,r=1e7;
    while(l<r){
        int mid=(l+r)/2;
        if(bfs(mid)) r=mid;
        else l=mid+1;
    }
    if(bfs(l)) cout<<l<<endl;
    else cout<<-1<<endl;
}
signed main()
{
    solve();
    return 0;
}

E.动物朋友

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#define int long long
using namespace std;
int n,m;
deque<int>q;
void solve()
{
    cin>>n>>m;
    int res=0;
    int sum=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        sum+=x;
        q.push_back(x);
        if(sum==m) res++;
        while(sum>=m&&q.size()){
            int t=q.front();
            sum-=t;
            q.pop_front();
            if(sum==m) res++;
        }
    }
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

F.松鼠排序

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
void solve()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int res=0;
    for(int i=1;i<=n;i++){
        while(a[i]!=i){
           swap(a[i],a[a[i]]);
           res++;
        }
    }
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

G.Reverse

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<set>
#include<queue>
#define int long long
using namespace std;
void solve()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    s+='0';
    int cnt=0;
    priority_queue<int>q;
    for(int i=0;i<=n;i++){
        if(s[i]=='0') {
            q.push(cnt);
            cnt=0;
        }
        else if(s[i]=='1') cnt++;
    }
    int res=0;
    if(q.size()){
        int t=q.top();
        q.pop();
        res+=t;
    }
    if(q.size()){
        int t=q.top();
        q.pop();
        res+=t;
    }
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

H.迷宫探险

用bfs求最短路,先将起点放入队列

然后一层层拓展,遇到道路,则向四周拓展一步

遇到弹射器,则四个方向拓展x距离,只需看最后是否越出边界或者遇到墙壁 、

注意之前是通过标记位置表示已经走过,而已经走过则表示到这是最短距离

但是这里有弹射,所以走过并不代表是最短距离,所以这里比较和起点之间的距离大小

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
//#define int long long,以后不要轻易用这个了
using namespace std;
typedef pair<int,int>PII;
const int N=3010;
char s[N][N];
int d[N][N];
int len[N][N];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int n,m,k;
void bfs(){
    queue<PII>q;
    memset(d,0x3f,sizeof d);
    d[1][1]=0;
    q.push({1,1});
    while(q.size()){
        auto t=q.front();
        q.pop();
        if(s[t.first][t.second]=='.'){
            for(int i=0;i<4;i++){
                int x=t.first+dx[i],y=t.second+dy[i];
                if(x&&y&&x<=n&&y<=m&&s[x][y]!='#'&&d[x][y]>d[t.first][t.second]+1){
                    d[x][y]=d[t.first][t.second]+1;
                    q.push({x,y});
                }
            }
        }
        else{
            for(int i=0;i<4;i++){
                int x=t.first+dx[i]*len[t.first][t.second];
                int y=t.second+dy[i]*len[t.first][t.second];
            if(x>=1&&y>=1&&x<=n&&y<=m&&s[x][y]!='#'&&d[x][y]>d[t.first][t.second]){
                d[x][y]=d[t.first][t.second];
                q.push({x,y});
            }
        }
        }
    }
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>s[i][j];
        }
    }
    cin>>k;
    while(k--){
        int x,y,z;
        cin>>x>>y>>z;
        len[x][y]=z;
    }
    bfs();
    if(d[n][m]==0x3f3f3f3f) cout<<-1<<endl;
    else cout<<d[n][m]<<endl;
}
signed main()
{
    solve();
    return 0;
}

J.合唱比赛

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#define int long long
using namespace std;
void solve()
{
    int n;
    cin>>n;
    vector<int>a;
    int sum=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a.push_back(x);
        sum+=x;
    }
    sort(a.begin(),a.end());
    int len=a.size();
    int sum1=sum-a[len-1];
    printf("%.6f ",(double)sum1/(n-1));
    int sum2=sum-a[0];
    printf("%.6f\n",(double)sum2/(n-1));
}
signed main()
{
    solve();
    return 0;
}

K.以撒和隐藏房间

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#define int long long
using namespace std;
const int N=1010;
char s[N][N];
int n,m;
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>s[i][j];
        }
    }
    int res=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(s[i][j]!='0') continue;
            int normal=0,boss=0;
            if(i-1>=1){
                if(s[i-1][j]=='1') normal++;
                else if(s[i-1][j]=='2') boss++;
            } 
            if(i+1<=n){
                if(s[i+1][j]=='1') normal++;
                else if(s[i+1][j]=='2') boss++;
            } 
            if(j-1>=1){
                if(s[i][j-1]=='1') normal++;
                else if(s[i][j-1]=='2') boss++;
            } 
            if(j+1<=m){
                if(s[i][j+1]=='1') normal++;
                else if(s[i][j+1]=='2') boss++;
            } 
            if(normal==3&&boss==0) res++;
        }
    }
    if(res){
        puts("YES");
        cout<<res<<endl;
    }
    else puts("NO");
}
signed main()
{
    solve();
    return 0;
}

L.中位数

树状数组+二分

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#include<map>
#define int long long
#define iosy ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e6+10;
int a[N];
int tr[N];
int n,m;
int lowbit(int x){
    return x & -x;
}
void add(int x,int c){
    for(int i=x;i<=N;i+=lowbit(i)) tr[i]+=c;//注意这里区间范围是1e6
}
int sum(int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=tr[i];
    return res;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        add(a[i],1);
    }
    while(m--){
        int p,x;
        cin>>p>>x;
        add(a[p],-1);
        add(x,1);
        a[p]=x;
  //利用二分,在1到1e6之间查找答案
  //我们要找的是中位数,答案只有一个,所以我们只要一直压缩区间,直到最后找到的l和r相等,sum[l]刚好等于(n+1)/2
        int l=1,r=1e6;    
        while(l<r){
            int mid=(l+r)/2;
            if(sum(mid)>=(n+1)/2) r=mid;
            else l=mid+1;
        }
        cout<<l<<endl;
    }
}
signed main()
{
    iosy;
    solve();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023河南萌新联赛第(一)场:河南农业大学 的相关文章

随机推荐

  • JAVA字符集

    1 概述 本文主要包括以下几个方面 编码基本知识 java 系统软件 url 工具软件等 在下面的描述中 将以 中文 两个字为例 经查表可以知道其GB2312编码是 d6d0 cec4 Unicode编码为 4e2d 6587 UTF编码就
  • vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页

    设置代理 避免出现跨域问题 设置代理 避免出现跨域问题 proxyTable api target https www oschina net action apiv2 changeOrigin true pathRewrite api a
  • 给你一个id你会干嘛?

    信息收集 1 扫描端口 Nmap xxx xxx xxx xxx p 目录扫描 ip地址访问 操作系统 robots txt http 192 168 5 134 xxe 抓包进行判断存在xxe漏洞 查看etc passwd 查看admin
  • File类总结

    文章目录 File类 构造方法 创建功能 删除功能 重命名功能 判断功能 基本获取功能 高级获取功能 代码示例 判断D盘下面有没有 jpg后的文件 如果有 就输出此文件名称 文件名称过滤器的实现思想及代码 File类 构造方法 public
  • C++学习 1

    引入头文件 头文件写法 引入头文件 用户自己写的头文件 lt gt 标准库 include
  • else if 非return情况下必须有else

    return 的另一种理解 if update return insert if 之后 进去 return 到不了下面 不满足 到下面 相反 即 有了return 等于else 以上 即update insert只有一个会执行 相当于els
  • 字节设备注册的驱动开发(基于汇编语言)

    CSDN话题挑战赛第1期 活动详情地址 第1期话题PK赛 参赛话题 汇编知识分享 话题描述 我们的计算机知识就像一座金字塔 底层是数学 上面是数字电路 然后是汇编 再往上是操作系统 网络 数据库 高级编程语言 框架等等 我们不可能精通这个金
  • HTML语义标签和结构标签详解

    文章目录 实体标签 meta标签 语义化标签 结构化语义化标签 列表标签 在学习标签时我们应该注意的是他的语义 而不是他的显示效果 因为显示效果是在css中进行编写的 我们一定要做到分工明确清晰 实体标签 在网页中编写代码时 我们有时会使用
  • 4.1.4 规划、设计的艺术(技术)流派和常用技法(上)

    最后更新2021 08 25 超写实 人工 gt 脚本 gt 批处理 gt 微服务 gt 公有云 gt 公共IT基础设施 代表作品 Daniel Heilig手机拍照作品 腾讯云 阿里云 amazon azure gt 综合网管 gt 私有
  • 五、easyUI中的datagrid(数据表格)组件

    1 datagrid 数据表格 组件的概述 datagrid以表格形式展示数据 并提供了丰富的选择 排序 分组和编辑数据的功能支持 datagrid的设计用于缩短开发时间 并且使开发人员不需要具备特定的知识 它是轻量级的且功能丰富 单元格合
  • Ubuntu 最简单的方式安装chrome

    1 指定安装目录如下 cd opt 2 下载包 sudo wget https dl google com linux direct google chrome stable current amd64 deb 3 查看并安装 sudo d
  • 搭建 vue 开发环境: node.js安装+vue脚手架配置

    第一步 node环境安装 1 1 如果本机没有安装node运行环境 请下载node 安装包进行安装 1 2 如果本机已经安装node的运行换 请更新至最新的node 版本 下载地址 https nodejs org en 或者 http n
  • 读取excel

    import java io FileInputStream import java io IOException import java io InputStream import java text DateFormat import
  • JVM--调优--04--案例01--生产oom分析案例

    JVM 调优 04 案例01 生产oom分析案例 1 问题描述 项目首页 匿名无登陆 对首页进行150个线程 8小时压测 可以看到老年代一直在增加 visual gc 到某一时刻 直接oom 堆空间的图不是矩形 2 解决方案 堆dump文件
  • JDBC报错java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 14 to T

    出现这个错误的原因是 当数据库中的Date类型字段值是 0000 00 00 时 JDBC不能把 0000 00 00 转化为一个java sql Date 问题的解决方案是在连接数据库的url后加入 zeroDateTimeBehavio
  • java使用mybatis拦截器对数据库敏感字段进行加密存储并解密

    记录业务中遇到的使用场景 灵活对数据库敏感字段进行加密和解密 文章目录 前言 一 创建数据库表和实体类 二 Mapper Service Controller等 三 自定义注解 四 加密工具类 五 参数拦截器和结果集拦截器 六 运行结果 总
  • Unix编程艺术(前言)

    Preface 前言 Unix is not so much an operating system as an oral history NealStephenson Unix与其说是一个操作系统 不如说是一部口述史 作者 NealSte
  • 爬虫数据去重、存入数据库

    三种数据去重方式 1 数据存入mongodb时 可以对关键字进行复合索引 2 对数据的关键字进行哈希映射 生成的指纹判断是否存在redis的指纹集合中 如果存在 说明数据重复 3 布隆过滤器 可以实现大量数据去重 存入数据库 根据数据量及用
  • verify.js验证码

    文字验证码 mpanel6 pointsVerify defaultNum txtCount 默认的文字数量 checkNum 3 校对的文字数量 vSpace 5 间隔 type 2 arith 0 imgName pageContext
  • 2023河南萌新联赛第(一)场:河南农业大学

    2023河南萌新联赛第 一 场 河南农业大学 ACM NOI CSP CCPC ICPC算法编程高难度练习赛 牛客竞赛OJ C 硬币游戏 考察知识点 博弈 先说结论 若操作一次就能获胜则先手胜 若无论第一次怎么操作 第二次操作都能获胜则后手