Atcoder Beginner Contest 317

news2025/1/23 9:32:01

 A - Potions (atcoder.jp)

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=110;
int a[N];
int n,h,x;
void solve() {
    cin>>n>>h>>x;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        if(h+a[i]>=x){
            cout<<i<<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;
}

B - MissingNo. (atcoder.jp)

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
int n;
void solve() {
    cin>>n;
    set<int>s;
    int maxn=0;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        maxn=max(maxn,x);
        s.insert(x);
    }
    int y=*s.begin();
    for(int i=y;i<=maxn;i++){
        if(!s.count(i)){
            cout<<i<<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;
}

C - Remembering the Days (atcoder.jp)

一开始想的是最大生成树,但是了第三个样例后,知道这是不行的,因为不能有重复路径,树是可以走重复路径的

然后想到用dfs,对于每一个点进行dfs,然后对于找到的单向路径长度之和取max

错误代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N=15;
int vis[N];
vector<PII>e[N];
int n,m;
int ans;
void dfs(int x,int d) {
    vis[x]=1;
    if(!e[x].size()) {
        ans = max(ans, d);
        return;
    } else {
        for(auto v:e[x]) {
            int ver=v.first,dist=v.second;
            if(!vis[ver]) {
                dfs(ver,d+dist);
            }
        }
    }
}
void solve() {
    cin>>n>>m;
    for(int i=1; i<=m; i++) {
        int a,b,c;
        cin>>a>>b>>c;
        e[a].push_back({b,c});
        e[b].push_back({a,c});
    }
    ans=0;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) vis[j]=0;
        dfs(i,0);
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

错误之处在于:

第一个错误在于给答案赋值的时候,一直没有赋值进去,因为e[x],size()不可能等于0

其实完全可以一直赋值的,因为是取max,一直赋值的话是完全没有问题的

或者在遍历子节点时看有没有标记过的节点

第二个错误在于dfs没有恢复现场,当对图进行dfs时,一定要恢复现场

对图进行dfs的板子是固定的,如下:

void dfs(int x){
    vis[x]=1;
    for(auto v:e[x]){
        if(!vis[v]) dfs(v);
    }
    vis[x]=0;
}

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N=15;
int vis[N];
vector<PII>e[N];
int n,m;
int ans;
void dfs(int x,int d) {
    vis[x]=1;
        ans=max(ans,d);
        for(auto v:e[x]) {
            int ver=v.first,dist=v.second;
            if(!vis[ver]) {
                dfs(ver,d+dist);
            }
        }
    vis[x]=0;
}
void solve() {
    cin>>n>>m;
    for(int i=1; i<=m; i++) {
        int a,b,c;
        cin>>a>>b>>c;
        e[a].push_back({b,c});
        e[b].push_back({a,c});
    }
    ans=0;
    for(int i=1; i<=n; i++) {
        for(int j=1;j<=n;j++) vis[j]=0;
        dfs(i,0);
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

D - President (atcoder.jp)

一开始想贪心,每次贪席位最多的,但是后面想了想是不可能的,因为可能席位最多的那个,需要转移很多很多很多很多的票

如果一开始有贪心的思路,那么先不要急着写代码,先思考该贪心思路是否真的可行

错误代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<stack>
#define endl '\n'
#define int long long
using namespace std;
typedef long long ll;
const int N=110;
int n;
struct node{
    int x,y,z;
    int diff;
    bool operator<(const node &W)const{
        if(z==W.z) return diff<W.diff;
        return z>W.z;
    }
}q[N];
void solve() {
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++) {
        cin>>q[i].x>>q[i].y>>q[i].z;
        if(q[i].y>q[i].x) q[i].diff=q[i].y-q[i].x;
        else q[i].diff=0;
        sum+=q[i].z;
    }
    sort(q+1,q+1+n);
    int res=0;
    int ans=0;
//    for(int i=1;i<=n;i++){
//        cout<<q[i].x<<' '<<q[i].y<<' '<<q[i].z<<endl;
//    }
    for(int i=1;i<=n;i++){
        res+=q[i].z;
        if(q[i].diff) ans+=q[i].diff/2+1;
        if(sum-res<res) break;
    }
    cout<<ans<<endl;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

 

这题其实是01背包的变式,与经典的01背包问题不同,f[i][j]表示在前i个物品里选,价值为j所需要的物品最小重量

该题f[i][j]表示在前i场投票中选择若干场投票进行票数转移,赢得j个席位所需要转移的最少票数

枚举席位数,从0到sum

for(int i=1;i<=n;i++){
    for(int j=0;j<=sum;j++){
        //不获得第i场的席位
        f[i][j]=f[i-1][j];
        //获得第i场的席位
        if(a[i]>b[i]&&j-c[i]>=0) f[i][j]=min(f[i][j],f[i-1][j-c[i]]+0);//如果a[i]本来就大于b[i],那么不需要转移票数,直接获得席位,从j-c[i]转移到j,加0表示不需要转移票
        else if(a[i]<=b[i]&&j-c[i]>=0) f[i][j]=min(f[i][j],f[i-1][j-c[i]]+(b[i]-a[i])/2+1);//由于该场获得了c[i],所以从j-c[i]转移到j,最少需要转移的票数为(b[i]-a[i])/2+1
    }
}

这样的话,需要f[100][1e7],这样就爆空间了,所以优化为一维 

for(int i=1;i<=n;i++){
    for(int j=sum;j>=c[i];j--){
        if(a[i]>b[i]) f[j]=min(f[j],f[j-c[i]]+0);//如果a[i]本来就大于b[i],那么不需要转移票数,直接获得席位,从j-c[i]转移到j,加0表示不需要转移票
        else if(a[i]<=b[i]) f[j]=min(f[j],f[j-c[i]]+(b[i]-a[i])/2+1);//由于该场获得了c[i],所以从j-c[i]转移到j,最少需要转移的票数为(b[i]-a[i])/2+1
    }
}

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#define endl '\n'
#define int long long
using namespace std;
typedef long long ll;
const int N=110,M=1e7+10;
int a[N],b[N],c[N];
int f[M];
int n;
void solve() {
    cin>>n;
    int sum=0;
    for(int i=1; i<=n; i++) {
        cin>>a[i]>>b[i]>>c[i];
        sum+=c[i];
    }
    memset(f,0x3f,sizeof f);
    f[0]=0;
    for(int i=1; i<=n; i++) {
        for(int j=sum; j>=c[i]; j--) {
            if(a[i]>b[i]) f[j]=min(f[j],f[j-c[i]]+0);//如果a[i]本来就大于b[i],那么不需要转移票数,直接获得席位,从j-c[i]转移到j,加0表示不需要转移票
            else if(a[i]<=b[i]) f[j]=min(f[j],f[j-c[i]]+(b[i]-a[i])/2+1);//由于该场获得了c[i],所以从j-c[i]转移到j,最少需要转移的票数为(b[i]-a[i])/2+1
        }
    }
    int ans=1e18;
    //枚举席位数大于半数时最少需要转移的票数
    for(int i=(sum+1)/2;i<=sum;i++){
        ans=min(ans,f[i]);//一直取min就行了,某些席位i可能组成不了(因为席位都是一个个离散的数,不是连续的),则f[i]为无穷大
    }
    cout<<ans<<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 - Avoid Eye Contact (atcoder.jp)

最短路,用bfs

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=2010;
char s[N][N];
int vis[N][N];//标记是否可走以及是否走过
int h,w;
int x,y;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1};
struct node {
    int x,y;
    int d;
};
queue<node>q;
int bfs() {
    q.push({x,y,0});
    s[x][y]='#';
    while(q.size()) {
        auto t=q.front();
        q.pop();
        int x=t.x,y=t.y,d=t.d;
        for(int i=0; i<4; i++) {
            int tx=x+dx[i],ty=y+dy[i];
            if(tx<1||tx>h||ty<1||ty>w) continue;
            if(vis[tx][ty]==1||s[tx][ty]=='#') continue;
            if(s[tx][ty]=='G') return d+1;
            if(s[tx][ty]='.') {
                q.push({tx,ty,d+1});
                s[tx][ty]='#';
            }
        }
    }
    return -1;
}
void solve() {
    cin>>h>>w;
    for(int i=1; i<=h; i++) {
        for(int j=1; j<=w; j++) {
            cin>>s[i][j];
            if(s[i][j]=='S') {
                x=i;
                y=j;
            }
        }
    }
    //预处理障碍
    for(int i=1; i<=h; i++) {
        for(int j=1; j<=w; j++) {
            if(s[i][j]=='^') {
                vis[i][j]=1;
                int k=i-1;
                while(k>=1&&(s[k][j]=='.'||s[k][j]=='S'||s[k][j]=='G')) {
                    vis[k][j]=1;
                    k--;
                }
            } else if(s[i][j]=='v') {
                vis[i][j]=1;
                int k=i+1;
                while(k<=h&&(s[k][j]=='.'||s[k][j]=='S'||s[k][j]=='G')) {
                    vis[k][j]=1;
                    k++;
                }
            } else if(s[i][j]=='<') {
                vis[i][j]=1;
                int k=j-1;
                while(k>=1&&(s[i][k]=='.'||s[i][k]=='S'||s[i][k]=='G')) {
                    vis[i][k]=1;
                    k--;
                }
            } else if(s[i][j]=='>') {
                vis[i][j]=1;
                int k=j+1;
                while(k<=w&&(s[i][k]=='.'||s[i][k]=='S'||s[i][k]=='G')) {
                    vis[i][k]=1;
                    k++;
                }
            }
        }
    }
//    cout<<endl;
//    for(int i=1;i<=h;i++){
//        for(int j=1;j<=w;j++){
//            cout<<vis[i][j];
//        }
//        cout<<endl;
//    }
    cout<<bfs()<<endl;
}
int 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/942696.html

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

相关文章

【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}

map和set的介绍和使用 一、关联式容器 关联式容器和序列式容器是C STL中的两种不同类型的容器。 关联式容器是基于键值对的容器&#xff0c;其中每个元素都有一个唯一的键值&#xff0c;可以通过键值来访问元素。关联式容器包括set、multiset、map和multimap。 序列式容器是…

从零做软件开发项目系列之七——用户培训

开展用户培训工作是确保软件项目成功的重要一环。以下是一个详细的步骤指南&#xff0c;用于规划和执行用户培训。 1. 确定培训目标和用户。 首先需要识别用户角色。确定项目中不同用户角色和职能&#xff0c;例如管理员、操作员、管理人员等。不同角色可能需要不同的培训内容…

14.工作式指针和数字时钟

源码 源码 <!doctype html> <html><head><meta charset="utf-8"><title>Clock</title><link rel="stylesheet" href="style.css"></head><body><div class="container">…

epoll 基于多线程的边沿非阻塞处理

往期文章推荐&#xff1a; epoll() 多路复用 和 两种工作模式_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132523789?spm1001.2014.3001.5501 epoll_server.c #include <stdio.h> #include &l…

python venv 打包,更换路径后,仍然读取到旧路径 ,最好别换路径,采用docker封装起来

机械盘路径 /home/yeqiang/code/xxx 移动到 /opt/xxx 编辑/opt/xxx/venv/bin/activate VIRTUAL_ENV"/home/yeqiang/code/xxx/venv" 改为 VIRTUAL_ENV"/opt/xxx/venv" 下面还有这么多&#xff0c;参考&#xff1a; (venv) yeqiangyeqiang-MS-7B23:/…

Kubernetes入门 十一、网络之Service

目录 概述Service 原理Service 四种类型创建 Service代理 k8s 外部服务反向代理外部域名 概述 在 Kubernetes 中&#xff0c;Pod 是应用程序的载体&#xff0c;我们可以通过 Pod 的 IP 来访问应用程序&#xff0c;但是 Pod 的 IP 地址不是固定的&#xff0c;这就意味着不方便直…

MyBatisPlus实现多租户功能

前言&#xff1a;多租户是一种软件架构技术&#xff0c;在多用户的环境下&#xff0c;共有同一套系统&#xff0c;并且要注意数据之间的隔离性。 一、SaaS多租户简介 1.1、SaaS多租户 SaaS&#xff0c;是Software-as-a-Service的缩写名称&#xff0c;意思为软件即服务&#x…

【电源专题】读一读单节锂电池保护IC规格书

在文章【电源专题】单节锂离子电池的保护的基本原理 中我们了解了电池包的过充、过放、过流、短路等保护功能。那么这些功能都会在电池保护IC规格书中体现吗?体现在哪些地方?哪些参数是我们应关注的呢? 对于手册中的电压检测,如放电过流、充电过流和负载短路等检测电压都代…

开源软件的国际化和本地化

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

centos7删除乱码文件

centos7删除乱码文件1. 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.解释 当文件名为乱码的时候&#xff0c;无法通过键盘输入文件名&#xff0c;所以在终端下就不能直接利用rm&#xff0c;mv等命令管理文件了。 但是每个文件都有一个i节点号&#xff0c;可以通过…

《Flink学习笔记》——第三章 Flink的部署模式

不同的应用场景&#xff0c;有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式&#xff08;作业角度/通用分类&#xff09; 根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManage…

AIGC - 生成模型

AIGC - 生成模型 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 (Generat…

【最强最全】视频号下载助手(支持视频号视频, 直播,回放下载)

视频号下载助手支持视频号视频, 直播,回放的下载&#xff0c;本工具基于秦天sunny中间件编写&#xff0c;无需再使用其它抓包软件&#xff0c;无需再使用其它下载软件。 当然&#xff0c;你也可以右键复制抓取后的视频源再用其它下载软件下载。 使用说明 解压文件&#xff0c;…

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行&#xff08;Flexbox Wrapping&#xff09;⭐ 示例&#xff1a;实现换行⭐ 排序&#xff08;Flexbox Ordering&#xff09;⭐ 示例&#xff1a;实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得…

基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的仓库商品管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…

流媒体弱网优化之路(BBR应用)——GCC与BBR的算法思想分析

流媒体弱网优化之路(WebRTC)——GCC与BBR的算法思想分析 —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全配置&…

【洛谷算法题】P1001-A+B Problem【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1001-AB Problem【入门1顺序结构】&#x1f30f;题目背景&#x1f30f;题目描述…

【Linux操作系统】Linux系统编程中条件变量实现生产者消费者模型

在Linux系统编程中&#xff0c;条件变量是一种用于线程间同步的机制&#xff0c;常用于实现生产者消费者模型。生产者消费者模型是一种常见的并发编程模型&#xff0c;用于解决多线程环境下的数据共享和同步问题。在该模型中&#xff0c;生产者负责生产数据&#xff0c;消费者负…

53 个 CSS 特效 3(完)

53 个 CSS 特效 3&#xff08;完&#xff09; 前两篇地址&#xff1a; 53 个 CSS 特效 153 个 CSS 特效 2 这里是第 33 到 53 个&#xff0c;很多内容都挺重复的&#xff0c;所以这里解释没之前的细&#xff0c;如果漏了一些之前的笔记会补一下&#xff0c;写过的就会跳过。…