AtCoder Beginner Contest 332 A-E 题解

AtCoder Beginner Contest 224题解 A-G AtCoder Beginner Contest 224 签到题、简单题 A - Tires 判断一个字符串是不是以er或ist结尾。 直接做即可 #include <bits/stdc++.h> using namespace std; int main() { string s; cin >> s; int n = s.size(); if (n >= 2 && s[n-1]=='r' && s[n-2]= 阅读详情

比赛链接:https://atcoder.jp/contests/abc332
比赛时间:2023年 12 月 10 日 20:00-21:40

A题:Online Shopping

标签:枚举、模拟
题意:给定 n n n个物品,第 i i i个物品的价格是 p i p_i pi​,需要购买件数是 q i q_i qi​,如果购买物品的总花费大于等于 s s s,不需要支付运费,否则需要支付运费 k k k,求最终支付的金额。
题解:求一下购买物品的总花费,判断下是否大于等于 s s s,对应输出即可。
代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    ll n, s, k, sum = 0;
    cin >> n >> s >> k;
    for (int i = 1; i <= n; i++) {
        ll p, q;
        cin >> p >> q;
        sum += p * q;
    }
    if (sum >= s) cout << sum;
    else cout << sum + k;
    return 0;
}

B题:Glass and Mug

标签:模拟
题意:给定 G G G容量的玻璃杯和 M M M容量的马克杯,一开始两个杯子里面都没水,给定以下操作先后顺序,求 K K K次操作之后,两个杯子中各自的水量。( G < M G<M G<M)

  1. 如果玻璃杯装满水(即装满 G G G),倒掉玻璃杯中所有水。
  2. 否则,如果马克杯是空的,装满水。
  3. 否则,将马克杯中的水倒到玻璃杯中。

题解:按照题目要求模拟就好了,维护两个变量,两个杯子中各自水量情况。按照题目中的先后顺序,模拟这 K K K次操作。注意第三个情况,我们把水从马克杯往玻璃杯倒的时候,需要考虑到目前玻璃杯还能装多少 以及马克杯能倒过去多少,应该要拿这两种情况中的小的那个倒过去。
代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int k, g, m;
    cin >> k >> g >> m;

    // 当前玻璃杯里的水量 马克杯里的水量
    int a = 0, b = 0;
    for (int i = 1; i <= k; i++) {
        if (a == g) {
            a = 0;
        }
        else if (b == 0) {
            b = m;
        }
        else {
            // 当前玻璃杯里还能装多少水量
            // 当前马克杯里的水量
            int x = min(g - a, b);
            a += x;
            b -= x;
        }
    }
    cout << a << " " << b << endl;
    return 0;
}

C题:T-shirts

标签:枚举、模拟
题意:给定一个长度为 N N N的字符串 S S S(只含 0 、 1 、 2 0、1、2 0、1、2),表示具体日程安排。
0 0 0:没有计划; 1 1 1:出去吃饭; 2 2 2:参加竞赛
0 0 0:没有计划的日子,会把所有穿过的T恤洗掉
1 1 1:出去吃饭,可以穿素色T恤或者带 l o g o logo logo的T恤
2 2 2:参加竞赛,只能穿带 l o g o logo logo的T恤
一开始给定你 M M M件素色T恤,求最少要购买几件带 l o g o logo logo的T恤才能满足日程安排?
穿过了的 T恤就不能再穿了,除非给它重新洗过了。
( 1 < = M < = N < = 1000 1<=M<=N<=1000 1<=M<=N<=1000)
题解:发现其实 N N N很小,所以我们可以直接从小到大枚举一下需要购买的带 l o g o logo logo的 T恤数量,然后跑下字符串 S S S的日程,看看是否满足日程安排。因为是从小到大,找到的第一个就可以直接输出了。
题目中有要求,穿过了的 T恤就不能再穿了,除非给它重新洗过了。所以我们在枚举带 l o g o logo logo的 T恤数量的过程中,需要维护一下目前还没穿和已经穿过的素色 T恤数量、目前还没穿和已经穿过的带 l o g o logo logo的 T恤数量。

以下是针对于具体日程安排的处理逻辑:
0 0 0:没有计划的日子,会把所有穿过的T恤洗掉;这时候把对应已经穿过的加到未穿过的数量上,然后把对应已经穿过的数量置 0 0 0。
1 1 1:出去吃饭,很显然要优先穿素色的T恤,先判这个逻辑;如果没有未穿过的素色T恤,再考虑穿带 l o g o logo logo的 T恤,如果带 l o g o logo logo的 T恤也没有,那说明现在枚举的购买 T恤数量 k k k不够,跳出往后找更大数量。
2 2 2:参加竞赛。和出去吃饭的逻辑差不多,只不过因为只能穿带 l o g o logo logo的T恤,所以直接判带 l o g o logo logo的情况就好了。
代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    string s;
    cin >> n >> m >> s;

    // k: 买带logo的T恤 件数
    for (int k = 0; k <= n; k++) {
        bool f = 1;
        int a1 = m, a2 = 0; // plain  没穿过/已经穿过
        int b1 = k, b2 = 0; // logo  没穿过/已经穿过
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '0') {
                a1 += a2; a2 = 0;
                b1 += b2; b2 = 0;
            }
            else if (s[i] == '1') {
                if (a1 > 0) a1--, a2++;
                else {
                    if (b1 > 0) b1--, b2++;
                    else {
                        f = 0;
                        break;
                    }
                }
            }
            else if (s[i] == '2') {
                if (b1 > 0) b1--, b2++;
                else {
                    f = 0;
                    break;
                }
            }
        }
        if (f == 1) {
            cout << k << endl;
            return 0;
        }
    }
    return 0;
}

D题:Swapping Puzzle

标签:全排列、深度优先搜索
题意:给定两个行数和列数分别是 H H H和 W W W的二维矩阵 A A A和 B B B。可以对 A A A矩阵的相邻两行或者相邻两列进行交换,求最少的交换次数能够使得 A A A矩阵变成 B B B矩阵。( 2 < = H , W < = 5 2<=H,W<=5 2<=H,W<=5)
题解:看到这个数据这么小,很容易想到暴搜。对矩阵 A A A的行和列分别做一个全排列深搜。
举个例子,比如行数 H = 3 H=3 H=3,列数 W = 3 W=3 W=3。
那么一开始行的情况: 1 、 2 、 3 1、2、3 1、2、3
来看个行的其中一个全排列的情况: 2 、 3 、 1 2、3、1 2、3、1,这个情况也就是说现在的第 1 1 1行是原来的第 2 2 2行,现在的第 2 2 2行是原来的第 3 3 3行,现在的第 3 3 3行是原来的第 1 1 1行。

那我们是不是弄出了一种行的交换情况,那这种情况行到底交换了多少次呢?熟悉逆序数的同学,应该能发现交换的次数 其实就是这个情况的序列逆序数的值。
比如这里 2 、 3 、 1 2、3、1 2、3、1, 2 2 2要在 1 1 1的前面 肯定是和 1 1 1进行了交换。

同理,列也是类似的;我们对行和列都做一个全排列操作之后,分别统计一下对应序列的逆序数值,相加一下就是改变成目前这种情况,总的交换次数。

然后还有个问题就是如何去判断这种情况下 A A A矩阵和 B B B矩阵是否相同的,我们可以把全排列的情况记录一下,到时候比较的时候看看这种情况下 A A A矩阵的当前行和当前列是对应初始 A A A矩阵的哪一行和哪一列,然后对应进行比较即可。
代码:

#include <bits/stdc++.h>
using namespace std;

int n, m, ans = 1e9;
int a[15][15], b[15][15];
int c[15], d[15], vis1[15], vis2[15];

void dfs1(int p) { // 做列的全排列
    if (p == m + 1) {
        bool f = true;
        for (int i = 1; i <= n; i++) {
            if (!f) break;
            for (int j = 1; j <= m; j++) {
                if (a[c[i]][d[j]] != b[i][j]) {
                    f = false;
                    break;
                }
            }
        }
        if (f) {
            int cnt = 0; // 操作次数
            for (int i = 1; i <= n; i++)
            for (int j = i + 1; j <= n; j++)
            if (c[i] > c[j]) cnt++;

            for (int i = 1; i <= m; i++)
            for (int j = i + 1; j <= m; j++)
            if (d[i] > d[j]) cnt++;
            ans = min(ans, cnt);
        }
        return ;
    }
    for (int i = 1; i <= m; i++) {
        if (!vis2[i]) {
            vis2[i] = 1;
            d[p] = i;
            dfs1(p + 1);
            vis2[i] = 0;
        }
    }
}

void dfs2(int p) { // 针对行做一个全排列
    if (p == n + 1) {
        dfs1(1);
        return ;
    }
    for (int i = 1; i <= n; i++) {
        if (!vis1[i]) {
            vis1[i] = 1;
            c[p] = i; // 现在的第p行是原来的第i行
            dfs2(p + 1);
            vis1[i] = 0;
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
    cin >> a[i][j];

    for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
    cin >> b[i][j];

    dfs2(1);
    if (ans == 1e9) ans = -1;
    cout << ans;
    return 0;
}

E题:Lucky bag

标签:贪心、随机化
题意:给你 n n n件物品,第 i i i件物品的权重为 w i w_i wi​,想要把这些物品分成 d d d组,希望最小化总重量的方差。
方差定义: V = 1 D ∑ i = 1 D ( x i − x ˉ ) 2 V=\frac{1}{D}\displaystyle\sum_{i=1}^D (x_i-\bar{x})^2 V=D1​i=1∑D​(xi​−xˉ)2, x ˉ \bar{x} xˉ定义为各组数据和的平局值: x ˉ = 1 D ( x 1 + x 2 + ⋯ + x D ) \bar{x}=\frac{1}{D}(x_1+x_2+\cdots+x_D) xˉ=D1​(x1​+x2​+⋯+xD​)
题解: 通过观察能发现这是一个贪心,当 x i x_i xi​的值越接近答案越小, 我们可以把每个数加到当前和最小的组里,然后通过随机化 进行多次贪心,随机化的次数可以稍微多点。每次贪心把序列打乱, 然后多次进行操作获得对应的值,从中取最小值就可以了。
代码:

#include <bits/stdc++.h>
using namespace std;

int n, d, w[20], b[20], t = 2000000;
double ans = 1e18, sum = 0;

int main() {
    cin >> n >> d;
    for (int i = 1; i <= n; i++) {
        cin >> w[i];
        sum += w[i];
    }
    double avg = sum / d;
    while (t--) {
        memset(b, 0, sizeof(b));
        random_shuffle(w + 1, w + n + 1);
        int k = 1;
        sum = 0;
        for (int j = 1; j <= n; j++) {
            for (int i = 2; i <= d; i++) {
                if (b[i] < b[k]) k = i;
            }
            b[k] += w[j];
            k = 1;
        }
        for (int i = 1; i <= d; i++) sum += (avg - b[i]) * (avg - b[i]);
        sum = sum / d;
        ans = min(ans, 1.0 * sum);
    }
    printf("%.15lf", ans);
    return 0;
}
Atcoder ARC103测试数据 日本竞赛网站Atcoder的ARC103场的测试数据,题面可以在Atcoder找到。 立即下载

相关推荐

Atcoder ARC102测试数据

日本竞赛网站Atcoder的ARC102场的测试数据,题面可以在Atcoder找到。

atcoder ABC beginer 332 D - Swapping Puzzle

暴力枚举,分别对行和列进行全排列,然后检查这种方案是否能使a与b相同,并计算这种方案最少需要的操作数(也就是全排列方案中的逆序对的数量,这里我用了归并来计算,其实冒泡也就够了,因为数据范围很小,只有2-5),这里检查a与b是否相同用了一些技巧(从别人学来的)。=b[i][j](sta1存放的是行的方案,sta2存的是列的方案),两种方案组成的新坐标就是在这种方案下每个数的新位置,比起一开始我想的用两个新的额外数组来模拟好得多啊。

2303_79684072的博客 286

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 490

测试数据

测试数据

路卫杰的专栏 1462

U24时钟信号上升下降沿出现非单调性--简单分析

交换机U24时钟信号上升下降沿出现非单调性--简单分析

qq_45185504的博客 1131

android10 部分机型(华为)无法正常更新安装app

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file://storage/emulated/0/文件夹名/***.apk typ=application/vnd.android.package-archive }

森森先生的博客 3927

atcoder测试数据

打了这么久,才发现atc能看测试数据,链接在这。

m0_73946557的博客 3329

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 265

Atcoder Beginner Contest 410 题解报告

ABC410 上金之场的题解 A-G

Timmylyx0518的博客 1377

YOLO11改进 | 主干网络 | 添加Hyper-YOLO的MANet混合聚合网络

本文详细介绍了在YOLO11目标检测模型中替换C3k2模块为MANet的具体实现方法。文章首先讲解MANet模块的原理,然后分步骤指导如何在YOLO11中添加该模块,包括代码修改、文件配置和模型注册等关键环节。通过实验对比,改进后的YOLO11_MANet模型在保持8.8GFLOPs计算量的同时,参数数量达到3,820,272,网络层数增加到343层。文章还提供了完整的代码实现和网络结构图,并建议结合其他注意力机制或损失函数进一步提升检测效果。最后推荐了相关的深度学习专栏,包含更多YOLO系列改进方法。

kay_545 658

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(2)- 核心控制消息;会话管理;测距会话管理

测距是UWB最核心的应用。为了方便应用调用测距接口,FIRA统一了UCI命令格式,这样各个厂商可以互相兼容。

Ankie资深技术项目经理 1276

AtCoder Beginner Contest 301

AtCoder Beginner Contest 301

青少年趣味编程 1576

保边滤波之Mean shift filter

保边滤波之Mean shift filter 目录 保边滤波之Mean shift filter 一、算法原理 二、练手实现的算法代码如下: 三、实现结果 一、算法原理 在OpenCV中,meanshift filter函数为 p...

大熊 1561

AtCoder Beginner Contest 326

AtCoder Beginner Contest 326

青少年趣味编程 1775

Holt-Winters方法预测水电发电量

Holt-Winters 模型, ARMIA,ACF检验 ,Dickey-Fuller 检测,白噪声检测,差分

firefox_yau的博客 1270

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AtCoder Beginner Contest 276

AtCoder Beginner Contest 276

青少年趣味编程 2130

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AtCoder Beginner Contest 328

AtCoder Beginner Contest 328

青少年趣味编程 1884

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

AtCoder Beginner Contest 332

AtCoder Beginner Contest 332

青少年趣味编程 1138

AtCoder Beginner Contest 380 题解

AtCoder Beginner Contest 380 题解

wojiejiedanio的博客 1360

AtCoder Beginner Contest 282

AtCoder Beginner Contest 282

青少年趣味编程 1552

AtCoder Beginner Contest 145

AtCoder Beginner Contest 145

青少年趣味编程 1833

AtCoder Beginner Contest 382

AtCoder Beginner Contest 382

青少年趣味编程 1995

AtCoder Beginner Contest 174

AtCoder Beginner Contest 174

青少年趣味编程 1387

AtCoder Beginner Contest 287

AtCoder Beginner Contest 287

青少年趣味编程 1862

AtCoder Beginner Contest 404 A-E 题解

还是ABC好打~比ARC好打多了(

W_Sherlock_Henry的博客 1177

Atcoder Beginner Contest 289

Atcoder Beginner Contest 289

青少年趣味编程 1614
上一篇: 提高组阶段数学
下一篇: USACO 2023年12月比赛 铜组题解
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值