AtCoder Beginner Contest 332 A~F

news2024/11/22 5:55:57

A.Online Shopping(计算)

题意:

需要购买 N N N种物品,第 i i i种物品的价格为 P i P_i Pi,且第 i i i件物品需买 Q i Q_i Qi件。

商店满 S S S元包邮,不满则需支付 K K K元邮费,问需支付多少钱。

分析:

按照要求计算,如果商品总价没到包邮门槛,那么就加上邮费。

代码:

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 3e5 + 5;

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    LL ans = 0;
    for (int i = 1; i <= n; i++) {
        int a, b;
        cin >> a >> b;
        ans += a * b;
    }
    if (ans < m) ans += k;
    cout << ans << endl;
}

int main() {
    solve();
    return 0;
}

B.Glass and Mug(模拟)

题意:

有两个杯子,一个玻璃杯,一个马克杯,每个杯子都有一个容量,且保证马克杯的容量比玻璃杯大。

你需要按以下要求进行 K K K次操作:

  • 如果玻璃杯装满水,将玻璃杯中水倒完

  • 如果玻璃没有装满水,且马克杯是空的,往马克杯里加满水

  • 否则,将马克杯里的水倒入玻璃杯中,直到马克杯空或玻璃杯满

分析:

按题目要求模拟即可。

代码:

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 3e5 + 5;

void solve() {
    int k, g, m;
    cin >> k >> g >> m;
    int glass = 0, mug = 0;
    while (k--) {
        if (glass == g) {
            glass = 0;
        } else if (mug == 0) {
            mug = m;
        } else {
            int add = min(mug, g - glass);
            glass += add;
            mug -= add;
        }
    }
    cout << glass << ' ' << mug << endl;
}

int main() {
    solve();
    return 0;
}

C.T-shirts(模拟)

题意:

给出一个长度为 N N N的字符串,字符串第 i i i个字符含义如下:

  • 0:在家休息(不需要穿T恤,且会把所有穿过的T恤洗掉,下一天所有T恤均可穿)

  • 1:出门吃饭(可以选择穿纯色T恤或带logo的T恤)

  • 2:参加比赛(必须选择带logo的T恤)

开始时拥有 M M M件纯色的T恤,问至少拥有多少件带logo的T恤才能保证这 N N N天都有衣服穿?

分析:

按要求进行模拟,如果休息就将穿过的T恤清空,如果出门吃饭,有纯色T恤就选纯色,没有就选带logo的,参加比赛也选择带logo的,记录过程中,最多穿过的带logo的T恤数量即可。

代码:

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 3e5 + 5;

void solve() {
    int n, m;
    string s;
    cin >> n >> m >> s;
    int plain = 0, logo = 0, ans = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '0') {
            plain = logo = 0;
        } else if (s[i] == '1') {
            if (plain < m) {
                plain++;
            } else {
                logo++;
            }
        } else {
            logo++;
        }
        ans = max(ans, logo);
    }
    cout << ans << endl;
}

int main() {
    solve();
    return 0;
}

D.Swapping Puzzle(枚举全排列)

题意:

给出两个 H × W H \times W H×W的网格 A A A B B B,每次可以选择一个数字 i i i进行以下两种操作之一:

  • 交换第 i i i行和第 i + 1 i + 1 i+1行所有元素

  • 交换第 i i i列和第 i + 1 i + 1 i+1列所有元素

问:输出将网格A变为网格B的最少操作次数,如果无法完成,输出出-1

分析:

行列的交换是互相不会产生影响的,因此可以使用两层循环使用全排列函数next_permutation对行列的最终排列进行枚举,然后检查是否满足题意,记录最小的交换次数即可。

Tips:不难发现,行列的交换次数为序列中逆序对数量,如序列{1, 3, 2, 5, 4},里面存在两对逆序对 ( 3 , 2 ) , ( 5 , 4 ) (3, 2), (5, 4) (3,2),(5,4),因此该序列是经过两次交换得到的。

代码:

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 3e5 + 5;

int row[10] = {0, 1, 2, 3, 4, 5}, colum[10] = {0, 1, 2, 3, 4, 5};
int n, m, a[10][10], b[10][10];

int getCost() {
    int res = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (row[i] > row[j]) {
                res++;
            }
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = i + 1; j <= m; j++) {
            if (colum[i] > colum[j]) {
                res++;
            }
        }
    }
    return res;
}

bool check() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[row[i]][colum[j]] != b[i][j]) {
                return false;
            }
        }
    }
    return true;
}

void solve() {
    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];
        }
    }
    do {
        do {
            if (check()) {
                cout << getCost() << endl;
                return;
            }
        } while (next_permutation(colum + 1, colum + m + 1));
    } while (next_permutation(row + 1, row + n + 1));
    cout << -1 << endl;
}

int main() {
    solve();
    return 0;
}

E.Lucky bag(二进制枚举,DP)

题意:

N N N件物品, M M M个幸运袋,每个物品均需被装入到一个袋子中,然后要求找到所有装入方案中方差最小中一种,即使 V V V最小:

  • V = 1 D ∑ i = 1 D ( x i − x ‾ ) 2 V = \frac{1}{D}\sum\limits_{i = 1}^{D}(x_i - \overline{x})^{2} V=D1i=1D(xix)2

其中 x i x_i xi为第 i i i个袋子中的物品价值总和, x ‾ \overline{x} x为袋子的平均价值。

分析:

可以先预处理一个幸运袋中所有的物品装入方案,使用二进制枚举进行。

然后使用 d p [ i ] [ j ] dp[i][j] dp[i][j]表示 0 ∼ i 0 \sim i 0i的袋子中放入了方案 j j j包含的物品的最小方差。

每一次计算 d p [ i ] [ j ] dp[i][j] dp[i][j]时,通过枚举所有方案 j j j的子集,并将当前袋子装入剩下部分的子集,使得两个子集刚好可以拼成方案 j j j,记录最小的方差。

Tips:枚举子集如果每次均通过减一的方式,时间复杂度就会变得很高,而每次减一后,再通过与当前枚举的集合 j j j进行与运算,既保证了当前方案为集合 j j j的子集,且只从上一个方案减一,即、也取到了下一个最大的方案。

代码:

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 3e5 + 5e4;

int n, m;

double w[20];
double s[N];
double dp[20][N];

void solve() {
    double avg = s[(1 << n) - 1] / m;
    for (int i = 0; i < m; i++) {
        for (int j = (1 << n) - 1; j >= 0; j--) {
            if (i == 0) {
                dp[i][j] = (s[j] - avg) * (s[j] - avg);//第一个幸运袋,直接放入
            } else {
                dp[i][j] = dp[i - 1][j] + avg * avg;//先假设当前袋子不放东西(需加上(avg - 0)^2)
                for (int k = j; k; k = (k - 1) & j) {//枚举子集
                    dp[i][j] = min(dp[i][j], dp[i - 1][j ^ k] + (s[k] - avg) * (s[k] - avg));//dp[0][k]可换为(s[k] - avg)^2
                }
            }
        }
    }
    cout << fixed << setprecision(15) << dp[m - 1][(1 << n) - 1] / m << endl;
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> w[i];
    for (int i = (1 << n) - 1; i >= 0; i--) {
        for (int j = 0; j < n; j++) {
            if ((i >> j) & 1) {
                s[i] += w[j];
            }
        }
    }
    solve();
    return 0;
}

F.Random Update Query(线段树,期望)

题意:

给出一个长度为 N N N的数组 A = A 1 , A 2 , . . . , A N A = A_1, A_2, ..., A_N A=A1,A2,...,AN

对这个数组进行以下操作 M M M次:

  • 随机的选择区间 L i ∼ R i L_i \sim R_i LiRi上的一个点(概率均等)

  • 将这个点修改为 X i X_i Xi

问结果 M M M次操作后,每个位置上的数字的期望是多少。

分析:

随机的选择区间上的数字服从于均匀分布,则每个数字被修改的概率为 1 len \frac{1}{\text{len}} len1,其中 l e n len len为区间内的数字个数。那么对于每个数字来说实际上服从于 01 01 01分布,即 A i A_i Ai的期望为:

  • E ( A i ) = A i × l e n − 1 l e n + X i × 1 l e n E(A_i) = A_i \times \frac{len - 1}{len} + X_i \times \frac{1}{len} E(Ai)=Ai×lenlen1+Xi×len1

对于每次操作,可以先对区间乘上 l e n − 1 l e n \frac{len - 1}{len} lenlen1,再加上 X i × 1 l e n X_i \times \frac{1}{len} Xi×len1,区间操作使用线段树辅助实现。

注意:

  • 除法转为乘法逆元

  • 双标记先推乘法,再推加法

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 998244353;
const int N = 2e5 + 5e2;

LL qpow(LL a, LL b) {
    LL res = 1;
    while (b) {
        if (b & 1) res = (res * a) % MOD;
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}

LL n, m, E[N << 2], add[N << 2], mul[N << 2];

void pushup(int x) {
    E[x] = (E[x << 1] + E[x << 1 | 1]) % MOD;
}

void build (int l, int r, int x) {
    if (l == r) {
        cin >> E[x];
        return;
    }
    mul[x] = 1;
    int mid = (l + r) >> 1;
    build(l, mid, x << 1);
    build (mid + 1, r, x << 1 | 1);
    pushup(x);
}

void pushdown(int l, int r, int x) {
    add[x << 1] = (add[x << 1] * mul[x] % MOD + add[x]) % MOD;
    add[x << 1 | 1] = (add[x << 1 | 1] * mul[x] % MOD + add[x]) % MOD;
    mul[x << 1] = (mul[x << 1] * mul[x]) % MOD;
    mul[x << 1 | 1] = (mul[x << 1 | 1] * mul[x]) % MOD;
    LL mid = (l + r) >> 1;
    E[x << 1] = (E[x << 1] * mul[x] % MOD + add[x] * (mid - l + 1) % MOD) % MOD;
    E[x << 1 | 1] = (E[x << 1 | 1] * mul[x] % MOD + add[x] * (r - mid) % MOD) % MOD;
    mul[x] = 1;
    add[x] = 0;
}

void update(int l, int r, int x, int ul, int ur, int op, LL val) {
    if (l >= ul && r <= ur) {
        if (op) {//乘法
            mul[x] = (mul[x] * val) % MOD;
            add[x] = (add[x] * val) % MOD;
            E[x] = (E[x] * val) % MOD;
        } else {//加法
            add[x] = (add[x] + val) % MOD;
            E[x] = (E[x] + val * (r - l + 1) % MOD) % MOD;
        }
        return;
    }
    pushdown(l, r, x);
    int mid = (l + r) >> 1;
    if (ul <= mid) update(l, mid, x << 1, ul, ur, op, val);
    if (ur > mid) update(mid + 1, r, x << 1 | 1, ul, ur, op, val);
}

void print(int l, int r, int x) {
    if (l == r) { if (l != 1) cout << ' ';
        cout << E[x];
        return;
    }
    pushdown(l, r, x);
    int mid = (l + r) >> 1;
    print(l, mid, x << 1);
    print(mid + 1, r, x << 1 | 1);
}

int main () {
    cin >> n >> m;
    build(1, n, 1);
    while (m--) {
        LL l, r, x;
        cin >> l >> r >> x;
        LL num = (r - l) * qpow(r - l + 1, MOD - 2) % MOD;
        update(1, n, 1, l, r, 1, num);
        num = x * qpow(r - l + 1, MOD - 2) % MOD;
        update(1, n, 1, l, r, 0, num);
    }
    print(1, n, 1);
    return 0;
}

学习交流

以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

『 Linux 』进程地址空间存在的意义

文章目录 前言&#x1f995;&#x1f996; 防止进程对物理内存的非法(危险)访问&#x1f996; 进程管理模块与内存管理模块的解耦合&#x1f996; 实现进程间的独立性 前言&#x1f995; 在文章『 Linux 』进程地址空间概念中提到了进程地址空间的部分概念; 这部分概念主要围绕…

设计模式—观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 在观察者模式中&#xff0c;有两个核心角色&#xf…

vue-如何实现带参数跳转页面

文/朱季谦 在vue框架的前端页面上&#xff0c;若要实现页面之间的带参数跳转&#xff0c;可参考以下实现过程&#xff1a; 例如&#xff0c;点击截图中的“查看试卷”&#xff0c;可实现带参跳转到相应的试卷页面&#xff0c;该功能类似查看试卷的详情页面&#xff1a; 假如以…

C#多线程总结

目录 前言 一、异步线程 使用async和await关键字 基于委托实现 二、同步线程 三、Thread线程 开启线程 设置线程优先级 Thread拓展封装 四、ThreadPool线程池 常规使用 设置线程数 线程等待 Thread和ThreadPool比较 通过线程池做一些扩展&#xff08;定时器类&am…

解析视频美颜SDK的算法:美肤、滤镜与实时处理

如今&#xff0c;美颜技术在视频处理中扮演着关键的角色&#xff0c;为用户提供更加精致的视觉体验。本文将深入探讨视频美颜SDK的算法&#xff0c;聚焦于美肤、滤镜与实时处理等方面&#xff0c;揭示背后的科技奥秘。 一、美肤算法的魅力 视频美颜的一个核心功能就是美肤&am…

被央视报道过的AIGC产品-贝塔创作(BetaCreator)使用指南

产品地址&#xff1a;betacreator.com 真人图 人台图 商品图 商品变色 建议使用浅色服装进行变色&#xff0c;效果更好 如果没有浅色服装&#xff0c;可以先把服装颜色变为白色

redis-学习笔记(Jedis 前置知识)

自定义的 Redis 客户端 咱们可以实现编写出一个自定义的 Redis 客户端 因为 Redis 公开了自己使用的自定义协议 ---- RESP 协议清楚了, 那么通信数据格式就清除了, 就能完成各层次之间的数据传输, 就能开发服务器和客户端 RESP — Redis 的 序列化 协议 特点: 简单好实现快读进…

App防止恶意截屏功能的方法:iOS、Android和鸿蒙系统的实现方案

防止应用被截图是一个比较常见的需求&#xff0c;主要是出于安全考虑。下面将分别为iOS&#xff08;苹果系统&#xff09;、Android&#xff08;安卓系统&#xff09;及HarmonyOS&#xff08;鸿蒙系统&#xff09;提供防止截屏的方法和示例代码。 在企业内部使用的应用中&…

python学习:浅拷贝与深拷贝详解

copy 一、 & is二、浅拷贝 & 深拷贝(一)、浅拷贝(二)、深拷贝 三、问题 一、’ ’ & ‘is’ ’ 和is是python对象比较常用的两种方式,简单来说,‘ ‘操作符比较对象之间的值是否相等,如 a b 而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个…

HNU数据库大作业-世界杯比赛系统

前言 之前做的那个版本bug较多&#xff0c;后进行了大量优化。 此项目是一个前后端分离的项目&#xff0c;前端主要使用htmlcssjs搭建&#xff0c;使用的是layui框架 后端使用php语言&#xff0c;仅实现了简单的查询数据库功能&#xff0c;无法实现多并发查询等复杂情况 数…

jetpack compose 学习(-)

年底了,无聊的时间总是缓慢的,找个事情做一做,打发打发时间,刚好看到jetpack compose 学习学习,毕竟androidStudio 默认创建的项目都带上了这个,学习网站:https://developer.android.com/jetpack/compose/modifiers?hlzh-cn 1. 首先androidStudio创建一个新项目 喜欢kotlin的,…

亚马逊、速卖通自养号测评的安全稳定性与成本优势分析

在跨境电商平台的运营中&#xff0c;买家评价的重要性不言而喻。很多买家在购买产品前都会查看评论&#xff0c;比较同类产品的买家口碑&#xff0c;以做出更明智的购买决策。 因此&#xff0c;测评一直是各大跨境电商平台的一种重要推广方式&#xff0c;测评同时也是很多卖家…

BugKu-Web-Simple_SSTI_1Simple_SSTI_2(浅析SSTI模板注入!)

何为SSTI模块注入&#xff1f; SSTI即服务器端模板注入&#xff08;Server-Side Template Injection&#xff09;&#xff0c;是一种注入漏洞。 服务端接收了用户的恶意输入以后&#xff0c;未经任何处理就将其作为Web应用模板内容的一部分&#xff0c;模板引擎在进行目标编译渲…

TCP/IP详解——网络基本概念

文章目录 一、网络基本概念1. OSI 7层模型1.1 每层对应的协议1.2 每层涉及的设备1.2.1 物理层设备1.2.2 数据链路层设备1.2.3 网络层设备1.2.4 传输层设备1.2.5 交换机和路由器的应用1.2.6 问题 2. TCP/IP 4层模型3. 物理层传输介质3.1 冲突域 4. 数据链路层4.1 以太网帧结构4.…

socket 套接字

1、套接字介绍 socket起源于Unix&#xff0c;遵循“一切皆文件”出发点&#xff0c;都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。 在设计模式中&#xff0c;Socket把复杂的TCP/IP协议族隐藏在Socket接口后面&#xff0c;Socket去组织数据&#xf…

Godot导出Android包报错:无效的包名称

问题描述 使用Godot为项目导出Android平台包时报错&#xff0c;提示&#xff1a;“无效的包名称&#xff1a;项目名称不符合包名格式的要求。请显式指定包名。” 解决办法 修改导出配置项“包->唯一名称”。 该项缺省值“org.godotengine.$genname”不能直接使用&#x…

36V/48V转12V 10A直流降压DC-DC芯片-AH1007

AH1007是一款36V/48V转12V 10A直流降压&#xff08;DC-DC&#xff09;芯片&#xff0c;它是一种高性能的降压变换器&#xff0c;常用于工业、汽车和电子设备等领域。 AH1007采用了先进的PWM调制技术和开关电源控制算法&#xff0c;能够高效地将输入电压从36V/48V降低到12V&…

SSM整合——Springboot

1.0 概述 1.1 持久层&#xff1a; DAO层&#xff08;mapper&#xff09; DAO层&#xff1a;DAO层主要是做数据持久层的工作&#xff0c;负责与数据库进行联络的一些任务都封装在此 DAO层的设计首先是设计DAO的接口&#xff0c; 然后在spring-mapper.xml的配置文件中定义此接…

【Unity学习笔记】光照简介

本节主要是简单介绍一些常见的光照组件和渲染设置。 文章目录 灯光类型平行光Directional Light点光源Point Light聚光灯Spot Light面积光 Area Light 阴影设置全局光照明光照模式直接光照与间接光照Mixed Lighting 光照探针Light Probe Group光照探针组 反射探针 灯光类型 在…

00后女孩月薪3200,3年买两套房,这个程序员变现新风口千万要把握住

00后女孩月薪3200&#xff0c;3年买两套房&#xff0c;这个程序员变现新风口千万要把握住 前几天&#xff0c;在网上看到了一份中国90后收入的调查报告&#xff1a; 报告显示&#xff1a; 90后月均收入8000元&#xff0c;三成90后零存款&#xff0c;两成90后存款达到10万以上…