首页 > 编程语言 >【题解】CEIT 2024 第三周算法训练 讲义题解

【题解】CEIT 2024 第三周算法训练 讲义题解

时间:2024-10-14 09:10:30浏览次数:1  
标签:int 题解 cin long 2024 x2 CEIT y1 y2

A. Orange的作文排版

关于处理若干行输入,我们可以用while结合getline函数来完成,每次读取一行,就让行数+1,然后每次利用string的size方法得到当前行的列数,更新最长的列,最后得到答案。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int a = 0;
    int b = 0;
    while(getline(cin, s))
    {
        a ++; // 行数
        b = max(b, (int)s.size()); // 列数
    }
    cout << a << ' ' << b << '\n';
}

B. 最长连号

对于位置 \(x\),每次使用一个指针p开始向后扫描,如果 \(a_p = a_{p-1}\),则说明是连续的,可以继续向后移动指针 \(p\),直到 \(a_p \neq a_{p-1}\),此时 \(p - x\) 就是当前的连续的长度,用它更新答案。每次扫过之后,将 \(x\) 移动到 \(p\) 的位置,继续向后扫描。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[50001];
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    int ans = 0;
    for(int i = 1, j = 1; i <= n; i = j)
    {
        do j ++; while(j <= n && a[j] - a[j - 1] == 1);
        ans = max(j - i, ans);
    }
    cout << ans << '\n';
}

C. Orange的区间和

一维前缀和

#include<bits/stdc++.h>
using namespace std;
 
long long a[200010], pre[200010]; // 原数组,前缀和数组
 
int main()
{
    cin.tie(0) -> sync_with_stdio(0);
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i]; // 计算前缀和
    }
    while(m --)
    {
        int l, r;
        cin >> l >> r;
        cout << pre[r] - pre[l-1] << '\n';
    }
}

D. Orange的区间和II

二维前缀和

#include<bits/stdc++.h>
using namespace std;
 
long long a[1005][1005], f[1005][1005];
 
int main()
{
    cin.tie(0) -> sync_with_stdio(0);
    int n, m, T;
    cin >> n >> m >> T;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            cin >> a[i][j];
            f[i][j] = a[i][j] + f[i-1][j] + f[i][j-1] - f[i-1][j-1];
        }
    while(T--)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        cout << f[x2][y2] - f[x2][y1-1] - f[x1-1][y2] + f[x1-1][y1-1] << '\n';
    }
}

E. Orange的区间修改

一维差分

#include<bits/stdc++.h>
using namespace std;
 
long long a[200010], d[200010];
 
int main()
{
    cin.tie(0) -> sync_with_stdio(0);
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        d[i] += a[i];
        d[i+1] -=a[i]; // 计算差分数组
    }
    while(m--)
    {
        int l, r, x;
        cin >> l >> r >> x;
        d[l] += x;
        d[r + 1] -= x;
    }
    for(int i = 1; i <= n; i ++)
    {
        d[i] += d[i - 1]; // 差分数组的前缀和就是原数组
        cout << d[i] << ' ';
    }
}

F. Orange的区间修改II

二维差分

#include<bits/stdc++.h>
using namespace std;
 
long long d[1005][1005];
 
void modify(int x1,int y1, int x2,int y2, int v)
{
    d[x1][y1] += v;
    d[x1][y2 + 1] -= v;
    d[x2 + 1][y1] -= v;
    d[x2 + 1][y2 + 1] += v;
}
 
int main()
{
    int n, m, t;
    cin >> n >> m >> t;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            int x;
            cin >> x;
            modify(i, j, i, j, x);
        }
    }
    while(t --)
    {
        int x1, y1, x2, y2, v;
        cin >> x1 >> y1 >> x2 >> y2 >> v;
        modify(x1, y1, x2, y2, v);
    }
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            d[i][j] = d[i][j] + d[i-1][j] + d[i][j-1] - d[i-1][j-1];
            cout << d[i][j] << ' ';
        }
        cout << '\n';
    }
}

G. Orange的闯关游戏II

假设我们将关卡进度分为主线(即首次通过该关卡)和扫荡,假设我当前主线通关到第 \(x\) 关时,我不选择继续向前推进主线,而是选择扫荡之前的关卡,那么为了保证收益最大,我们应该选择前 \(x\) 关中扫荡收益最大的一个关卡,即 \(Max_{i = 1}^x b_i\) 去通关,因此这样能够保证收益最大化。此时我们扫荡的收益为 \((q - x) \times Max_{i = 1}^x b_i\)(因为前面花费了 \(x\) 点体力去推主线),加上之前主线的收益(即之前所有的首通奖励): \(\sum_{i=1}^x a_i\) 。最后我们可以得到推主线到 \(x\) 关时的最大收益:

\[f(x) = \sum_{i=1}^x a_i + (q - x) \times Max_{i = 1}^x b_i \]

然后我们去枚举主线从1推到 \(min(q, n)\) 关的最大收益(因为最多只有n个关卡或者q点体力),取最大值即可。

对于 \(\sum_{i=1}^x a_i\) 我们可以对 \(a\) 数组作前缀和从而快速计算,对于 \(Max_{i = 1}^x b_i\) ,我们可以对 \(b\) 数组作前缀最大值从而快速计算。

时间复杂度: \(O(n)\)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, q;
    cin >> n >> q;
    int a[200010], b[200010];
    for(int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        a[i] += a[i - 1];
    }
    for(int i = 1; i <= n; i ++)
    {
        cin >> b[i];
        b[i] = max(b[i], b[i-1]);
    }
    int ans = 0;
    for(int i = 1; i <= min(n, q); i ++)
    {
        ans = max(ans, a[i] + (q - i) * b[i]);
    }
    cout << ans;
}

标签:int,题解,cin,long,2024,x2,CEIT,y1,y2
From: https://www.cnblogs.com/orangecodelog/p/18463420

相关文章

  • 2024.10.08
    2024.10.08P3251JLOI2012时间流逝设\(f(S)\)为可重复集\(S\)进化的期望天数。\[f(S)=pf(P)+\frac{1-p}{m}\sum_{i=1}^mf(T)+1\]\(P\)为\(S\)除去最小值的集合,\(T\)为\(S\)加上一个元素的集合。不难发现,集合构成了一颗树的形态,根是空集,\(S\)父亲为\(P\),\(T\)父......
  • Burp Suite Professional 2024.9 发布下载,新增功能概览
    BurpSuiteProfessional2024.9(macOS,Linux,Windows)-Web应用安全、测试和扫描BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:https://sysin.org/blog/burp-suite-pro/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgBu......
  • Windows Server 2025 OVF, released Sep 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2025OVF,releasedSep2024(sysin)-VMware虚拟机模板2024年9月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2025-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现......
  • Windows 11 绕过 TPM 方法总结,24H2 通用免 TPM 镜像下载 (Updated Oct 2024)
    Windows11绕过TPM方法总结,24H2通用免TPM镜像下载(UpdatedOct2024)在虚拟机、Mac电脑和TPM不符合要求的旧电脑上安装Windows11的通用方法总结请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • 写在 2024-10-14 20 岁。
    今天yspm20岁了!过去品味起来挺有趣的,将来期待起来挺好玩的。过去总担心在赢者通吃的时代不当最大的赢家就会成为永远的输家,现在其实也不觉得这是杞人忧天,只不过无论哪种赢都是localmaxima,既然没有绝对的完美,也就自然没必要被一些localmaxima的表象迷惑而让自己不痛快。本......
  • 2024/9/16 CSP-S模拟赛试题
    A这题是很有意思的一个题,思路就是你考虑kt的位置只可能在四个角,因为这种情况下,他的距离才会最远对吧,所以你就暴力找另一个人fengwu的点的位置,然后计算他们之间的距离然后你求一个\(\max\)即可,然后记录一下这些\(\max\)的值,最后排个序就好了。代码:#include<bits/stdc++.h>usi......
  • 01背包问题/Ieee全球极限编程大赛11.0题BeetleBag题解/洛谷P1926 小书童——刷题大军
    基础01背包问题概述给出一个容积为V的背包,有i个物体,每个物体都有自己的体积和价值,用Vi和Wi表示,要将这些物体装进背包里面,问怎样才能使得装入物体的总价值最大?最大为多少?解决思路1.如果你没能正确理解这道题,尤其是对于很多新手,第一反应可能是将所有物体的单位价值算出来,然后......
  • ChatGPT官网中文版镜像网站整理(2024/10/13)
    一、什么是ChatGPT?ChatGPT是由OpenAI开发的一种基于GPT(GenerativePretrainedTransformer)模型的人工智能对话系统。它使用了深度学习技术中的一种叫做Transformer的架构,通过对大量文本数据进行预训练和微调,能够理解并生成自然语言。二、GPT工具跟国内AI大模型整理(一......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第2、3周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第2、3周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写......
  • 软件著作权申请教程(超详细)(2024新版)软著申请
               目录一、注册账号与实名登记二、材料准备三、申请步骤1.办理身份2.软件申请信息3.软件开发信息4.软件功能与特点5.填报完成一、注册账号与实名登记    首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份......