首页 > 其他分享 >AtCoder Beginner Contest 334题解

AtCoder Beginner Contest 334题解

时间:2023-12-24 14:55:57浏览次数:52  
标签:AtCoder 题目 题解 代码 cin let ans 334 qwq

⭐AtCoder Beginner Contest 334


前言:
比赛题目链接
--按照惯例只写了主要部分的代码--
特别说明:Rust有一个竞赛用的输入库,并且写ABC是可以用的,但是平时写洛谷是用不了的,所以我自己写了一个cin(),凑活能用,代码见下:

读输入函数
fn cin() -> String {
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    input.trim().to_string()
}

明明 2、3 都是简单题却过不了,果然是因为做了一天题导致晚上状态下滑了嘛

模拟只会猜题意,贪心只能过样例;数学上来先打表,DP一般看规律;组合数学靠运气,计算几何瞎暴力;图论强行套模板,数论只会GCD;递推莫名UKE,递归堆栈往外溢;深搜茫然TLE,广搜队列MLE;二分查找总CE,叉堆结果必RE;高精算法找规律,做完全都OLE;数据结构干瞪眼,水题也都WA;长知识也不容易,考试一来全懵B!

目录:


点击题目跳转

  1. 题目A:签到题
  2. 题目B:数学植树问题
  3. 题目C:类似滑动窗口
  4. 题目D:前缀和+二分查找

第一题

A

题目分析

签到题,输出大的就行,题目还说明了不会有相等的情况

代码实现

C++代码
void solve() {
    int b, g;
    cin >> b >> g;
    cout << (b > g ? "Bat" : "Glove");
}
Rust代码
fn solve() {
    let (a, b) = cin()
        .split_whitespace()
        .fold((0, 0), |x, y| (x.1, y.parse::<i32>().unwrap()));
    println!("{}", if a > b { "Bat" } else { "Glove" });
}

第二题

B

题目分析

数学题,我们分别计算出 r 到 a 有多少点以及 l 到 a 有多少点。我们希望左区间减一后向下取整,右区间向下取整,接着作差得到答案

  • Rust代码中,我们使用div_euclid()实现向下取整。div_euclid() 是执行欧几里得除法,即找到\(Self=q*rhs+r\)中的 q ,实现向下取整(默认的除法是省略小数部分,并非向下取整)

代码实现

C++代码
void solve() {
    long double a,m,l,r;
    cin >> a >> m >> l >> r;
    ll ans = floor((r - a) / m) - floor((l - 1 - a) / m);
    cout << ans;
}
Rust代码
fn solve() {
    let (a, b, c, d) = cin().split_whitespace().fold((0, 0, 0, 0), |x, y| {
        (x.1, x.2, x.3, y.parse::<i128>().unwrap()) //读输入
    });
    println!("{}", (d - a).div_euclid(b) - (c - 1 - a).div_euclid(b));
}

第三题

C

题目分析
理解题意,题目中的袜子按递增顺序给出,而我们都知道差值最小的方案就是两个颜色最接近的,而对于任意两个袜子之间的最大值,我们按如下方式考虑:
image1
不难想到,每次取相邻的得到的差是最小的
image2
而得到的差即为n-1,而这等于直接将xn与x1配对
image3
于是我们得到结论,每次取相邻两个之间的差即可
但对于奇数个的情况,我们需要找到哪个是需要不配对的,也就是找出最小值
可以先将第一个排除,我们得到后\(\lfloor \frac{n}{2}\rfloor\)对的和,即:
image
接着我们开始向后遍历,每次取前两个差的和减去后两个差的和:
image
这里我们假设蓝色会与绿色相消,那么得到的结果就是:
image
那么依次执行,每次比较这个值和一开始的值哪个小,遍历完之后得到结果
代码部分

C++代码
void solve() {
    int n, i, ans = 0;
    cin >> n >> n;
    vector<int> qwq(n);
    for(auto &x : qwq)cin >> x;
    for(i = n % 2 == 0 ? 1 : 2;i < n;i += 2)ans += qwq[i] - qwq[i - 1];
    if(n % 2 == 1) {
        int now = ans;
        for(i = 1;i < n;i += 2) {
            now += 2 * qwq[i] - qwq[i - 1] - qwq[i + 1];
            ans = min(ans, now);
        }
    }
    cout << ans;
}
Rust代码
fn solve() {
    let (_, n) = cin()
        .split_whitespace()
        .fold((0, 0), |x, y| (x.1, y.parse::<usize>().unwrap()));
    let qwq = cin()
        .split_whitespace()
        .map(|s| s.parse().unwrap())
        .collect::<Vec<i32>>();
    let st = if n % 2 == 1 { 2 } else { 1 };
    let mut ans = 0;
    for i in (st..n).step_by(2) {
        ans += qwq[i] - qwq[i - 1];
    }
    if st == 2 {
        let mut now = ans;
        (1..n - 1).step_by(2).for_each(|i| {
            now += 2 * qwq[i] - qwq[i - 1] - qwq[i + 1];
            ans = ans.min(now);
        })
    }
    println!("{}", ans);
}

第四题

D

题目分析
我们知道最小的两个货物数之和肯定是最小的,我们每次取最小的肯定是最理想的情况
于是我们先对数组排个序,接着求出前缀和数组,得到的数组的索引加一就是能拉的货物数量,只需判断给定的鹿的数量在数组中的哪个位置即可,所以我们利用二分查找得到答案。
记得开long long

十年OI一场空,不开long long见祖宗

代码部分

C++代码
void solve() {
    int n, q, i;
    ll j;
    cin >> n >> q;
    vector<ll>qwq(n);
    for(auto &x : qwq)cin >> x;
    sort(qwq.begin(), qwq.end());
    for(i = 1;i < n;++i)qwq[i] += qwq[i - 1];
    for(i = 0;i < q;++i) {
        cin >> j;
        cout <<' '<< (upper_bound(qwq.begin(), qwq.end(), j)-qwq.begin())<<'\n';
    }

}
Rust代码
fn solve() {
    let (a, b) = cin()
        .split_whitespace()
        .fold((0, 0), |x, y| (x.1, y.parse::<usize>().unwrap()));
    let mut qwq = cin()
        .split_whitespace()
        .map(|s| s.parse().unwrap())
        .collect::<Vec<i128>>();
    qwq.sort_unstable();
    (1..a).for_each(|x| qwq[x] += qwq[x - 1]);
    for _ in 0..b {
        let n: i128 = cin().parse().unwrap();
        println!("{}", qwq.partition_point(|&x| x <= n))
    }
}

标签:AtCoder,题目,题解,代码,cin,let,ans,334,qwq
From: https://www.cnblogs.com/Allergy/p/17924371.html

相关文章

  • 【题解】洛谷P1496 火烧赤壁 (离散化)
    P1496火烧赤壁-洛谷|计算机科学教育新生态(luogu.com.cn)我们首先先看数据,n<=20000,数据不多,但是范围大(-10^9<=Ai,Bi<=10^9),这时,就可以用离散化了。但是在这里我们会遇到区间重合的问题(也可以使用区间合并),如下图本题的题意是让我们求出燃烧位置的长度之和。区间重合时只......
  • [ABC265F] Manhattan Cafe 题解
    [ABC265F]ManhattanCafe题解思路解析很有思维难度的一道题。思路是dp,\(f[i][j][k]\)表示已经计算了\(i\)维,距离点\(p\)的距离为\(j\),距离点\(q\)的距离为\(k\)时的整点\(r\)个数,由此可见我们的每一维都可以从上一维推出来,也即\(f[i][j][k]\)可以由\(f[i-1][j......
  • ABC334 全套题解
    A-ChristmasPresent简单题。voidslv(){ inta=Read<int>(),b=Read<int>(); if(a>b)Puts("Bat"); elsePuts("Glove"); return;}B-ChristmasTrees也是简单题。constexpri128INF=-1e18;i128a,m,l,r;voidslv(......
  • AtCoder Beginner Contest 334 G Christmas Color Grid 2
    洛谷传送门AtCoder传送门考虑相当于把每个标记点的边全部断掉,然后求连通块个数。考虑一条边\((u,v)\)(设\(u<v\))的出现时间,不难发现是\([1,u-1]\cup[u+1,v-1]\cup[v+1,n]\)。于是考虑直接套线段树分治和可撤销并查集。时空复杂度均为\(O(n^2\logn)\)......
  • 题解 ABC334G【Christmas Color Grid 2】
    先求出初始时绿连通块数量。将一个绿色格子染成红色,会改变绿连通块数量,当且仅当这个绿色格子是孤点或割点。如果是孤点,会使得绿连通块数量减少一;如果是割点,会使得绿连通块数量增加它所在的点双数量减一。根据上述规则可以求出每个绿色格子染红后的绿连通块数量,求平均值即可。时......
  • 题解 ABC334F【Christmas Present 2】
    设\(f_i\)表示假设只有编号为\(1\simi\)的点,此时的答案。\(f_n\)即为所求。显然有:\[f_i=\min\limits_{i-k\lej<i}\{f_j+dis(s\toj+1\toj+2\to\cdots\toi)\}+dis(i\tos)\]当\(i\toi+1\)时,大括号内部全局增加\(dis(i\toi+1)\),可以全局打标记后单调队列维护。......
  • 题解 ABC334E【Christmas Color Grid 1】
    先求出初始时绿连通块数量。枚举每个红色格子,将其染成绿色本应增加一个绿连通块,但是它每与一个绿连通块相邻,就又会减少一个绿连通块。根据上述规则可以求出每个红色格子染绿后的绿连通块数量,求平均值即可。时间复杂度\(O(nm)\)。//Problem:E-ChristmasColorGrid1//Co......
  • 检查Windows更新问题解决
    在任务栏搜索框输入cmd,点击右侧的“以管理员身份运行”,打开后输入:(建议复制粘贴,防止输入有误出现错误提示等请忽略*)SCconfigwuauservstart=auto回车(Enter按键)SCconfigbitsstart=auto回车(Enter按键)SCconfigcryptsvcstart=auto回车(Enter按键)SCconfigtrustedin......
  • AtCoder Beginner Contest 334
    A-ChristmasPresent(abc334A)题目大意给定两个数\(b,g(b\neqg)\),如果\(b\)大则输出Bat,否则输出Glove。解题思路比较大小输出即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(f......
  • 【题解】洛谷P1068 [NOIP2009 普及组] 分数线划定 (map)
    ##题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的$150\%$划定,即如果计划录取$m$名志愿者,则面试分数线为排名第$m\times150\%$(向......