ABC341 A-G

news2025/3/15 8:14:12

Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341) - AtCoder

B读不懂题卡了,F读假题卡了,开题开慢了rank++了

A - Print 341

题意:

打印一串交替出现的包含N个0,N+1个1的01串

代码:

void solve()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        printf("10");
    printf("1");
}

B - Foreign Exchange

题意:

有N个国家的货币,每个国家的货币初始有Ai个,国家 i 的货币可以换为国家 i + 1 的货币,比例为Si : Ti,问最多能拥有多少国家N的货币

题解:

从前往后尽量换完换即可

LL a[N];
void solve()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld", &a[i]);
    for (int i = 1; i < n; ++i)
    {
        LL s, t;
        scanf("%lld%lld", &s, &t);
        t *= a[i] / s;
        a[i + 1] += t;
    }
    printf("%lld\n", a[n]);
}

C - Takahashi Gets Lost

题意:

给出N行M列的图,'.'表示可以经过的格子,'#'表示不能经过的格子,给出一串指令集,包含LRUD四种指令(分别表示往左右上下走,具体解释见原题),问有多少个初始位置能满足执行以上一串指令时不经过'#'

题解:

500^3暴力即可

char op[N], mp[N][N];
int check(int x, int y)
{
    int i = 1;
    while (op[i])
    {
        if (mp[x][y] == '#')return 0;
        if (op[i] == 'L')y -= 1;
        if (op[i] == 'R')y += 1;
        if (op[i] == 'U')x -= 1;
        if (op[i] == 'D')x += 1;
        ++i;
    }
    return mp[x][y] == '.';
}
void solve()
{
    int n, m, t;
    scanf("%d%d%d%s", &n, &m, &t, op + 1);
    for (int i = 0; i <= n + 1; ++i)
    {
        for (int j = 0; j <= m + 1; ++j)
            mp[i][j] = '#';
    }
    for (int i = 1; i <= n; ++i)
    {
        getchar();
        for (int j = 1; j <= m; ++j)
            mp[i][j] = getchar();
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
            ans += check(i, j);
    }
    printf("%d\n", ans);
}

D - Only one of two

题意:

找出第k个是n的倍数或者是m的倍数切不同时是n,m的倍数的数

题解:

关于x是第几个数可以直接通过容斥求得:f(x) = x / n + x / m - 2 * (x / lcm(n, m)),然后二分答案即可

LL n, m, k, lcm;
LL gcd(LL x, LL y)
{
    return y ? gcd(y, x % y) : x;
}
LL check(LL x)
{
    return x / n + x / m - 2 * (x / lcm);
}
void solve()
{
    scanf("%lld%lld%lld", &n, &m, &k);
    lcm = n * m / gcd(n, m);
    LL l = 0, r = 2e18;
    while (l < r)
    {
        LL mid = l + r >> 1;
        if (check(mid) < k)
            l = mid + 1;
        else
            r = mid;
    }
    printf("%lld\n", l);
}

E - Alternating String

题意:

给出一个长度为n的01串,当一个01串被称为好的必须符合以下条件:任意相邻数字不同(01交替出现)。你需要对这个01串进行m次询问,询问分为两种

1 L R:反转区间L到R内的元素(0变成1,1变成0)

2 L R:查询L到R的子串是否是好的

题解:

我们可以仅考虑对于每对相邻元素是否相同,不考虑具体每个元素是0还是1,对于修改操作仅会使得(l - 1, l)与(r, r + 1)这两对相邻元素是否相同的性质反转,我们可以用一个set存所有相同的相邻元素位置(如存左边的元素下标)。对于修改操作我们仅需查询set内是否已经存在l - 1,若存在则删除,不存在则加入,右边同理,这样维护这个集合。对于查询操作我们仅需查询set中是否不存在l, r - 1范围的元素即可(set是支持二分查找的,可以通过*st.lower_bound(l) >= r 求得)

char ch[N];
set<int>st;
void solve()
{
    int n, m;
    scanf("%d%d%s", &n, &m, ch + 1);
    for (int i = 1; i < n; ++i)
    {
        if (ch[i] == ch[i + 1])
            st.insert(i);
    }
    while (m--)
    {
        int op, l, r;
        scanf("%d%d%d", &op, &l, &r);
        if (op == 1)
        {
            if (st.find(l - 1) != st.end())
                st.erase(l - 1);
            else
                st.insert(l - 1);
            if (st.find(r) != st.end())
                st.erase(r);
            else
                st.insert(r);
        }
        else
        {
            auto it = st.lower_bound(l);
            if (it == st.end() || *it >= r)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
}

F - Breakdown

题意:

给出一张n个点m条边的无向简单图,每个点都有一个权值Wi,初始每个点上面都放有Ai个棋子,你需要进行以下操作直至棋盘上没有棋子:

选择一个棋子,删除它,记改棋子所在点的编号为x,选择一个点集S,需要使得集合内的所有点与点x相邻,且\sum _{y\in S}W_{y}<W_{x},并在每个属于点集S的点放上一颗棋子

求最大的操作次数

应该也可以线段树做(可能能写类似于维护最大区段和的写法),但上面做法更简单就懒得想了

题解:

背包DP,我们可以对每个点求一个 Si 表示在这个点上放一个棋子最多能进行多少次操作,与它相连的 x 个点看为 x 个物品,每个物品 j 的重量为 wj ,价值为 sj ,当前节点的容量为 wi - 1 ,显然这是一个01背包问题。

其次我们需要按 Wi 的值从小到大依次求每个点的 Si ,因为当我们求 i 点的 Si 时只会用到 Wj < Wi 的点做背包,只有当所有 Wj < Wi 的点的 Sj 才能求 Si

int w[N];
PII t[N];
vector<int>e[N];
LL s[N];
void solve()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++i)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &w[i]);
        t[i] = { w[i],i };
    }
    sort(t + 1, t + 1 + n);
    for (int i = 1; i <= n; ++i)
    {
        int u = t[i].second;
        vector<LL>dp(w[u]);
        for (auto v : e[u])
        {
            for (int j = w[u] - 1; j >= w[v]; --j)
                dp[j] = max(dp[j], dp[j - w[v]] + s[v]);
        }
        for (auto j : dp)
            s[u] = max(s[u], j + 1);
    }
    LL ans = 0;
    for (int i = 1, x; i <= n; ++i)
        scanf("%d", &x), ans += x * s[i];
    printf("%lld\n", ans);
}

G - Highest Ratio

题意:

给出一个长度为N的数组,对于每个左端点求最大子段平均值

题解:

赛时不会做,赛后看群友说的:

记 Si 为前 i 个元素的前缀和,在平面上放N个点(i, Si),第 x 个点到第 y 个点连线的斜率即为区间(x + 1, y)的平均值(平均值 = (Sy - Sx) / (y - x) = 斜率),在这个图上求凸包即可

double cross(PLL x, PLL y)//向量叉乘,直接乘好像会爆longlong用了double
{
    return (double)x.first * y.second - (double)x.second * y.first;
}
PLL operator-(PLL x, PLL y)//重载向量减法
{
    return { x.first - y.first,x.second - y.second };
}
double fun(PLL v)//求向量斜率
{
    return (double)v.second / v.first;
}
LL s[N];
double ans[N];
void solve()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &s[i]), s[i] += s[i - 1];
    vector<PLL>v{ {n,s[n]} };
    for (int i = n - 1; i >= 0; --i)
    {
        PLL x = { i,s[i] };
        while (v.size() > 1)//典 凸包板子
        {
            PLL y = v.back(), z = v[v.size() - 2];
            if (cross(y - x, z - y) < 0)break;
            v.pop_back();
        }
        ans[i + 1] = fun(v.back() - x);
        v.push_back({ i,s[i] });
    }
    for (int i = 1; i <= n; ++i)
        printf("%.10lf\n", ans[i]);
}

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

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

相关文章

OpenCV-40 绘制直方图

一、使用matplotlib画直方图 可以利用matplotlib把OpenCV统计得到的直方图绘制出来 示例代码如下&#xff1a; import cv2 import matplotlib.pyplot as pltlena cv2.imread("beautiful women.png") # 变为黑白图片 gray cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY…

视觉设计师的项目评审复盘攻略:如何提升设计质量与效率

视觉设计师的角色是至关重要的&#xff0c;以确保设计项目满足预期的质量和结果。作为一名视觉设计师&#xff0c;有必要进行定期的项目审查&#xff0c;以确保项目在正轨上进行&#xff0c;并尽早解决任何问题。在本文中我们将讨论可视化设计人员如何做好项目评审&#xff0c;…

HarmonyOS—@State装饰器:组件内状态

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&a…

永久禁止windows自动更新方法

文章目录 前言一、打开本地组策略编辑器二、禁用windows更新总结 前言 每次打开电脑&#xff0c;右下角就会弹出设备更新提示&#xff0c;看着令人烦恼&#xff0c;并且更新可能导致电脑设置发生改变甚至是卡顿&#xff0c;所以为了自己方便于是出了禁用电脑更新的办法&#x…

「算法」二分查找1:理论细节

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;算法详解 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 二分查找算法简介 这个算法的特点就是&#xff1a;细节多&#xff0c;出错率高&#xff0c;很容易就写成死循环有模板&#xff0c;但…

Day46 300最长递增子序列 674最长连续递增子序列 718最长重复子数组 1143最长公共子序列

300 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序…

CV | Segment Anything论文详解及代码实现

本文主要是详解解释了SAM的论文部分以及代码实现~ 论文&#xff1a;2023.04.05_Segment Anything 论文地址&#xff1a;2304.02643.pdf (arxiv.org) 代码地址&#xff1a;facebookresearch/segment-anything: The repository provides code for running inference with the Seg…

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】长篇详解&#xff0c;字符系列篇1-----“混杂”的各种字符函数……&#xff0c;图文讲解各种字符函数&#xff0c;带大家更深刻理解C语言中各种字符函数的应用&#xff0c;感谢观看&#xff0c;支持的可以给个赞哇。 前言…

SpringCloud-Nacos集群搭建

本文详细介绍了如何在SpringCloud环境中搭建Nacos集群&#xff0c;为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤&#xff0c;包括安装、配置以及Nginx的负载均衡设置&#xff0c;读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos&#xff0…

ClickHouse--12-可视化工具操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 可视化工具操作1 tabixhttp://ui.tabix.io/ 2 DBeaverhttps://dbeaver.io/download/ 可视化工具操作 1 tabix tabix 支持通过浏览器直接连接 ClickHouse&#xff…

2023年程序员观察报告

春节假期已过&#xff0c;2023年悄然过去&#xff0c;2024年已经到来&#xff0c;无论2023年是快乐的、成长的、积极的&#xff0c;亦或是痛苦的、寂寥的、迷茫的&#xff0c;都要恭喜在座的各位程序员又熬过了一年&#xff01; ①加班篇 2023年&#xff0c;你完成了 132个需求…

【DDD】学习笔记-聚合之间的关系

聚合之间的关系 无论聚合是否表达了领域概念的完整性&#xff0c;我们都要清醒地认识到这种所谓的“完整”必然是相对的。如果说在领域分析模型中&#xff0c;每个体现了领域概念的类是模型的最小单元&#xff0c;那么在领域设计模型中&#xff0c;聚合才是模型的最小单元。我…

基于ORB-SLAM2与YOLOv8剔除动态特征点

基于ORB-SLAM2与YOLOv8剔除动态特征点 以下方法以https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download#freiburg3_walking_xyz数据集进行实验测试APE 首先在不剔除动态特征点的情况下进行测试&#xff1a; 方法1:segment坐标点集合逐一排查剔除 利用YOLOv8的segm…

Kubernetes 元信息与控制器模型

一、资源元信息&#xff1a; Kubernetes 的资源对象组成&#xff1a;主要包括了 Spec、Status 和元数据。其中 Spec 部分用来描述期望的状态&#xff0c;Status 部分用来描述观测到的状态。 元数据主要包括了&#xff1a;Labels 用来识别资源的标签&#xff1b;Annotations 用…

术前皮肤大面积消毒杀菌工具耗材:PP手柄+海绵头洗必泰CHG涂药器

PP手柄海绵头洗必泰CHG消毒涂药器是一种常用于手术前皮肤消毒杀菌的工具。它由PP手柄和海绵头组成&#xff0c;海绵头上涂有必泰CHG消毒液。 这种消毒涂药器被广泛应用于医疗领域&#xff0c;特别是在手术前的皮肤消毒过程中。PP手柄是一种轻便且易于握持的材料&#xff0c;方便…

Vue练习3:组件开发3(页面切换)

预览 ——————————————————————————————————————————— 组件文档 Pager组件 属性 属性名含义类型必填默认值current当前页码&#xff08;总数据量/单页容量&#xff09;Number否1total总数据量Number否0limit单页容量Number否10vis…

Aster实现一台电脑当两台使——副屏使用独立win账号

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

javaweb——socket

定义 Socket&#xff08;套接字&#xff09;是计算机网络编程中的一种抽象&#xff0c;用于在网络上进行通信。它允许计算机之间通过网络进行数据传输。在Java中&#xff0c;Socket类提供了对TCP/IP协议的支持&#xff0c;通过它可以创建客户端和服务端程序&#xff0c;实现网…

Java基于 SpringBoot 的高校校园点餐系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

基于springboot学生考勤管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…