AtCoder Beginner Contest 319(D-G)

news2024/10/6 2:27:40

D.Tasks - AtCoder Beginner Contest 319

        (1)题意

                给你一个M行得框框和N个单词,每个单词有一个宽度,每个单词之间应该用一个空格隔开,首位单词不需要,问至少需要多宽才能使得单词不会超过M行。

        (2)解题思路

                直接二分宽度,然后check即可。

        (3)代码实现

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int L[N];
int n,m;
bool check(ll k)
{
    int cnt = 0;
    ll cur = 0;
    rep(i,1,n) {
        if(k < L[i]) {
            return false;
        }
    }
    rep(i,1,n) {
        if(cur - L[i] - 1 >= 0) {
            cur -= L[i] + 1;
        }
        else {
            cur = k - L[i];
            cnt ++;
        }
    }
    // cout << "???" << k << '\n';
    return cnt <= m;
}
void solve()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i ++) {
        cin >> L[i];
    }
    ll l = 1,r = 1e18;
    while(l <= r) {
        ll mid = (l + r) >> 1;
        if(check(mid)) r = mid - 1;
        else l = mid + 1;
    }
    cout << l << 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 - Bus Stops (atcoder.jp)

        (1)题意

                A要从自己家到B家,中间得路段构成是A先走一段路到达站点1,然后做公交到站点n,最后走一段路到B家,每一个站点得公交车会在P[i]倍数得时间发车,需要T[i]得时间才能到达下一个站,现在有q个询问,每个询问给定你起始时间,问最后达到B家得最小时间是多少。

        (2)解题思路

                考虑每一个P[i]得倍数都会有一些余数,不妨把他们得最小公倍数求出来,然后预处理出0-最小公倍数得起始时间需要花费多少时间到达B家。

        (3)代码实现

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int p[N],t[N];
ll Ans[N];
int n,x,y;
ll calc(ll st)
{
    st += x;
    for(int i = 1;i < n;i ++) {
        int z = st % p[i];
        if(!z) z = p[i];
        st += p[i] - z;
        st += t[i];
    }
    return st + y;
}
void solve()
{
    cin >> n >> x >> y;
    set<int> pt;
    for(int i = 1;i < n;i ++) {
        cin >> p[i] >> t[i];
        pt.insert(p[i]);
    }
    int cur = 0;
    for(auto x : pt) {
        if(!cur) cur = x;
        else cur = cur * x / __gcd(cur,x);
    }
    for(int i = 0;i < cur;i ++) {
        Ans[i] = calc(i);
    }
    int q;
    cin >> q;
    for(int i = 1;i <= q;i ++) {
        ll v;
        cin >> v;
        int p = v % cur;
        cout << v - p + Ans[p] << '\n';
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

F - Fighter Takahashi (atcoder.jp)

        (1)题意

                你在一颗树上战斗,起初你的战斗力是1,树上每个点要么是药剂,要么是怪兽,如果是怪兽,你的战斗力大于等于他就可以击败他获取奖励战斗力,如果是药剂你可以使你得战斗力翻g[i]倍,现在问你是否可以从1号节点战败所有怪兽。

        (2)解题思路

                首先,若是你当前得实力够打怪兽,那么一定是先打得,如果不够了才考虑用药剂。那么一个很明显得思路是,确定一个吃药得顺序,然后bfs一遍看看能不能打完所有怪兽,那么时间复杂度显然是不太行得。所以我们考虑使用状压dp优化这个枚举吃药顺序得过程,状态dp[i]表示吃了i这些药最高能到得战斗力是多少,最后判一下是否大于等于最高战斗力得怪兽即可。

        (3)代码实现

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 505;
int t[N],s[N],g[N],p[N];
vector<int> e[N];
ll dp[1<<(10)];
void solve()
{
    int n,tot = 0;
    cin >> n;
    vector<int> med,pos(n + 1,0);
    int master = 0;
    rep(i,2,n) {
        cin >> p[i] >> t[i] >> s[i] >> g[i];
        if(t[i] == 2) {
            med.pb(i);
            pos[i] = sz(med) - 1;
            tot ++;
        }
        master = max(master,s[i]);
        e[p[i]].pb(i);
    }
    memset(dp,-1,sizeof(dp));
    //dp[i]:表示吃了这些药能达到最大得能量值
    dp[0] = 1;
    rep(i,0,(1<<tot)-1) {
        if(dp[i] != -1) {
            priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> q;
            q.push({-1,1});
            vector<bool> used(sz(med),false);
            int cnt = 0;
            ll S = 0;
            while(!q.empty()) {
                auto [val,ver] = q.top();
                q.pop();
                if(val > dp[i]) break;
                cnt ++;
                if(t[ver] == 2 && !(i >> pos[ver] & 1)) {
                    used[pos[ver]] = true;
                    continue;
                }
                if(t[ver] == 1) {
                    dp[i] += g[ver];
                    S += g[ver];
                }
                for(auto v : e[ver]) {
                    if(t[v] == 2) q.push({-1,v});
                    else q.push({s[v],v}); 
                }
            }
            // cout << i << ' ' << dp[i] << '\n';
            if(dp[i] >= master || cnt == n) {
                cout << "Yes" << '\n';
                return;
            }
            rep(j,0,tot-1) {
                if(used[j]) {
                    dp[i | (1 << j)] = max(dp[i | (1 << j)],dp[i] * g[med[j]] - S);
                }
            }
        }
    }
    cout << "No" << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

G - Counting Shortest Paths (atcoder.jp)

        (1)题意

                给你一个完全图,删除一些边后,问你是否能从1-N,如果能,请给出最短路径数量。

        (2)解题思路

               P1. 首先对于最短路径,我们考虑01bfs得特性,一旦有一个点进入了则不会再进入一次,因此我们可以用一个set维护一下未进入得点集,每次对于一个进入得点,扫描一下未进入得点集,若这个点和进入得点之间得边未删除,则可以把这个点加入队列,这样就可以很快得求得最短路径。

               P2.现在我们需要考虑路径数量得问题了,考虑将图分成如下形式。

                考虑dp[i],表示i为最短路径上的点的方案数是多少。那么显然对于点集为2的点dp[i]等价于所有点集为1的点的方案和-i不能到达的点集为1的点的方案,依次类推求出dp[n]即可。

        (3)代码实现

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
set<int> e[N],g[N],pos;
int dis[N];
using i64 = long long;

constexpr int P = 998244353;
// assume -P <= x < 2P
int Vnorm(int x) {
    if (x < 0) {
        x += P;
    }
    if (x >= P) {
        x -= P;
    }
    return x;
}
template<class T>
T power(T a, i64 b) {
    T res = 1;
    for (; b; b /= 2, a *= a) {
        if (b % 2) {
            res *= a;
        }
    }
    return res;
}
struct Mint {
    int x;
    Mint(int x = 0) : x(Vnorm(x)) {}
    Mint(i64 x) : x(Vnorm(x % P)) {}
    int val() const {
        return x;
    }
    Mint operator-() const {
        return Mint(Vnorm(P - x));
    }
    Mint inv() const {
        assert(x != 0);
        return power(*this, P - 2);
    }
    Mint &operator*=(const Mint &rhs) {
        x = i64(x) * rhs.x % P;
        return *this;
    }
    Mint &operator+=(const Mint &rhs) {
        x = Vnorm(x + rhs.x);
        return *this;
    }
    Mint &operator-=(const Mint &rhs) {
        x = Vnorm(x - rhs.x);
        return *this;
    }
    Mint &operator/=(const Mint &rhs) {
        return *this *= rhs.inv();
    }
    friend Mint operator*(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res *= rhs;
        return res;
    }
    friend Mint operator+(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res += rhs;
        return res;
    }
    friend Mint operator-(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res -= rhs;
        return res;
    }
    friend Mint operator/(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res /= rhs;
        return res;
    }
    friend std::istream &operator>>(std::istream &is, Mint &a) {
        i64 v;
        is >> v;
        a = Mint(v);
        return is;
    }
    friend std::ostream &operator<<(std::ostream &os, const Mint &a) {
        return os << a.val();
    }
};
void solve()
{
    int n,m;
    cin >> n >> m;
    for(int i = 1;i <= m;i ++) {
        int u,v;
        cin >> u >> v;
        e[u].insert(v);
        e[v].insert(u);
    }
    for(int i = 2;i <= n;i ++) {
        pos.insert(i);
    }
    memset(dis,0x3f,sizeof(dis));
    dis[1] = 0;
    queue<int> q;
    q.push(1);
    while(!q.empty()) {
        int v = q.front();
        q.pop();
        auto nps = pos;
        for(auto x : nps) {
            if(!e[v].count(x) && pos.count(x)) {
                dis[x] = dis[v] + 1;
                pos.erase(x);
                q.push(x);
            }
        }
    }
    if(dis[n] >= n) {
        cout << -1 << '\n';
        return;
    }
    for(int i = 1;i <= n;i ++) {
        if(dis[i] <= n) g[dis[i]].insert(i);
    }
    vector<Mint> dp(n + 1,0),s(n + 1,0);
    dp[1] = 1;
    for(int i = 0;i < n;i ++) {
        if(i >= 1) {
            for(auto x : g[i]) {
                dp[x] += s[i];
            }
        }
        for(auto x : g[i]) {
            s[i + 1] += dp[x];
            for(auto y : e[x]) {
                if(dis[y] == dis[x] + 1) {
                    dp[y] -= dp[x];
                }
            }
        }
    }
    cout << dp[n];
}
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/1002223.html

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

相关文章

Batch normalization和Layer normalization

深度学习的归一化方法 1 归一化的目的 当我们使用梯度下降法做优化时&#xff0c;随着网络深度的增加&#xff0c;输入数据的特征分布会不断发生变化&#xff0c;为了保证数据特征分布的稳定性&#xff0c;会加入Normalization。从而可以使用更大的学习率&#xff0c;从而加速…

快速搭建:对象存储平台MinIO

简介&#xff1a;MinIO 是一个高性能的对象存储服务器&#xff0c;兼容Amazon S3云存储服务。适用于大数据存储和用于构建私有云的场景。作为一个对象存储服务&#xff0c;它基于Apache License 开源协议&#xff0c;兼容Amazon S3云存储接口。适合存储非结构化数据&#xff0c…

【软件分析/静态分析】chapter8 课程11/12 指针分析—上下文敏感(Pointer Analysis - Context Sensitivity)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程11&#xff08;Pointer Analysis - Context Sensitivity I&#xff09;_哔哩哔哩_bilibili 南京大学《软件分析》课程12&#xff08;Pointer Analysis - Context Sensitivity II&…

PCL入门(四):octree简单使用

目录 1. 八叉树(Octree)2. 简单使用 参考博客《三维点云数据的两种结构Kdtree和Octree》和《八叉树》 1. 八叉树(Octree) 只需要考虑三维情况下的八叉树的情况&#xff0c;如下 设置最大的递归深度&#xff1b;找出场景的最大尺寸&#xff0c;并据此创建第一个立方体若未到达…

linux安装jdk1.8

1.下载jdk安装包&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8-windows 2.创建java文件夹&#xff1a; mkdir /usr/local/java3.上传安装包并解压&#xff1a; tar -xzf jdk-xxx.tar.gz4.修改profile文件&#xff1a; vim /etc/profile在文…

计算机专业毕业设计项目推荐04-物业管理系统(SpringBoot+原生Js+Mysql)

物业管理系统&#xff08;SpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计…

物联网 低功耗蓝牙BLE GATT 实现微信小程序通信连接详细教程

蓝牙基本概念 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz ~ 2.485GHz左右&#xff09;&#xff0c;进行电磁波传输。蓝牙传输原理是主从关系&#xff0c;一个主设备可以与7个蓝牙从设备配对。 经典蓝牙 vs BLE 蓝牙分为经典蓝牙和低功耗…

最新软件测试面试题+笔试题(十个面试官里有九个会问)

2023最新软件测试面试大全看完offer拿到手软_哔哩哔哩_bilibili2023最新软件测试面试大全看完offer拿到手软共计21条视频&#xff0c;包括&#xff1a;1.HR已读不回问题分析以及如何解决、2.HR已读不回之针对性进行简历优化。、3.HR已读不回之针对性进行技能提升路线。等&#…

编程语言流行度排名(每月更新)

2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;那么流行编程语言排名可以…

数据结构与算法之二叉树、二叉搜索树、平衡二叉树、红黑树、B - 树、哈夫曼树等详细教程(更新中)

第一章、二叉树概述和基本算法 1.1 二叉树遍历算法概述 对于二叉树&#xff0c;其实遍历顺序一共有6种&#xff0c;基于有左子树&#xff0c;右子树&#xff0c;根这三个因素&#xff0c;即排列组合有3 * 2 * 16种结合顺序&#xff0c;不过因为算法思想是一样的&#xff0c;就…

day 4

#!/bin/bashfunction adda() { #a($*)sum0 for i in $*do ((sumi))donereturn $sum }arr(5 4 3 2 1 50) adda ${arr[*]} add$? echo $addfunction A() { echo id -uecho id -g }BA echo "uid和gid分别是:"$Bxmind

基于springboot2+mybatis-plus+jsp增删改查

概述 编写简单增删改查&#xff0c;理解之后可以自己试着扩展&#xff0c;相信你也可以&#xff0c;加油&#xff0c;我自己懂了的用注释记在下面方便理解 详细 一、需求&#xff08;要做什么&#xff09; 基于现今最流行的技术实现增删改查demo&#xff0c; 便于初学者上手…

JAVAEE初阶相关内容第八弹--多线程(初阶)

本文目录 阻塞队列 阻塞队列是什么&#xff1f; 标准库中的阻塞队列 生产者消费者模型 阻塞队列的实现 普通队列实现&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 完整代码&#xff1a; 加阻塞 加锁 加阻塞 阻塞队列 队列&#xff1a;先进先出&#xff0c;…

福立转债,科数转债上市价格预测

福立转债118043 基本信息 转债名称&#xff1a;福立转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;7.0亿元。 正股名称&#xff1a;福立旺&#xff0c;今日收盘价&#xff1a;20.07元&#xff0c;转股价格&#xff1a;21.28元。 当前转股价值 转债面值…

Java—JDK8新特性—重复注解

目录 重复注解是什么&#xff1f; 常见的重复注解的应用场景 源码&#xff08;JDK中哪里&#xff1f;&#xff09; 在实际开发中哪里使用了注解&#xff08;举例&#xff09; 使用步骤 案例 重复注解是什么&#xff1f; 重复注解&#xff0c;一个注解可以在一个类、方法、…

限流式保护器在古建筑消防安全中的应用

安科瑞 华楠 【摘要】我国古建筑众多且具有自身的消防安全特性。本文结合当前古建筑消防安全形势从消防管理、防火设计及火灾扑救三个方面对我国古建筑消防安全问题进行系统的阐述并提出相关对策。 【关键词】古建筑&#xff1b;消防安全&#xff1b;电气防火&#xff1b;限流…

C++ String类的简单实现(非模板)

头文件 #ifndef MY_STRING_H #define MY_STRING_Hclass Mstring {private:int m_length;char* m_pointer;public://构造函数Mstring();//有参构造Mstring(const char* str);//拷贝构造Mstring(const Mstring& obj);//获取长度int length()const;//转换为C字符串const char…

sprinboot 引入 Elasticsearch 依赖包

1.springboot与es的版本有比较强的绑定关系&#xff0c;如果springboot工程引入es的依赖后报一些依赖的错误&#xff0c;那么就看表格中的对应关系&#xff0c;将sprinboot或者es的版本做对应的调整 2.本人是从springboot1.x升级到springboot2.x&#xff0c;做了排包工作 3.升级…

在海外如何通过App Store本地化提高下载量

随着应用市场的应用持续增长&#xff0c;越来越多的应用和游戏占据了全球排行榜的主导地位。因此本地化应用程序商店的展示&#xff0c;对于吸引更多用户并在当今的市场中竞争至关重要。应用程序本地化不仅仅包括简单的翻译&#xff0c;还需要处理内容本身。 1、针对客户使用的…

HummerRisk V1.4.1 发布

HummerRisk V1.4.1发布&#xff1a; 大家好&#xff0c;增加检测整合报告下载&#xff0c;定制多云整合报告并下载PDF&#xff0c;增加K8s 检测规则组&#xff0c;Kubernetes、Rancher、KubeSphere 检测规则组以及规则。新增云账号管理页面关联菜单&#xff0c;新增资源同步日…