VP Codeforces Round #797 (Div. 3)

简介: VP Codeforces Round #797 (Div. 3)

@[TOC]

比赛链接 : Codeforces Round #797 (Div. 3)

只写了前五题,F、G题还不是很理解。
在这里插入图片描述

A. Print a Pedestal (Codeforces logo?)

题目

题目大意:将一个数n,分成三个不同的整数,并且三个数中的最大那个数要最小

思路:构造+贪心

为了让最大值最小,首先将n等分为三份a=b=c=n/3;然后让a加1,c减一,这样三个数都不相同,然后再看剩下有几个,如果n只剩下一个,那么就只能加到a上,如果有两个,那么a和b分别加1个。这样就能使最大的数最小

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2e5 + 10;
int n;
void solve()
{
    cin >> n;
    int a, b, c;
    a = b = c = n / 3;
    b++;
    c--;
    if (n % 3 == 1)
    {
        b++;
    }
    else if (n % 3 == 2)
    {
        b++;
        a++;
    }
    cout << a << " " << b << " " << c << endl;
    return;
}

signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

B. Array Decrements

题目

题目大意:一个数组a,每次操作能让a数组中的每个元素减1,0就不用再减了。问从a通过多少次操作能让a变成b数组

思路:贪心

如果a的元素比b对应的元素小,那么一定不能变成b数组

因为0操作后不变。所以先查询a数组中每个元素变成b最大的次数,那么其他每个元素需要变成b都需要最大的操作次数,看其他的元素操作完之后是否等于b数组对应的元素即可

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 5e4 + 10;
int n;
int a[N], b[N];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> b[i];
    int k = 0;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] < b[i])
        {
            puts("NO");
            return;
        }
        k = max(k, a[i] - b[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        a[i] = max(0, a[i] - k);
        if (a[i] != b[i])
        {
            puts("NO");
            return;
        }
    }
    puts("YES");

    return;
}

signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

C.Restoring the Duration of Tasks

题目

题目大意:

在这里插入图片描述

思路:贪心+队列

我们知道了每个任务的起始时间和结束时间,需要记录一个当前已经进行到哪个时间,我们可以枚举每个任务,当前任务的起始时间比记录的时间大的话,当前时间就为这个起始时间,如果小的话,当前时间不变,每个任务的结束时间减去当前时间就是这个任务的执行时间了。然后在把当前时间为更新为结束时间。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2e5 + 10;
int n;
PII a[N];
int c[N];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i].x;
    for (int i = 1; i <= n; i++)
        cin >> a[i].y;
    int time = 0; //当前时间
    for (int i = 1; i <= n; i++)
    {
        time = max(time, a[i].x);
        c[i] = a[i].y - time;
        time = a[i].y;
    }
    for (int i = 1; i <= n; i++)
    {
        cout << c[i] << " ";
    }
    cout << endl;
    return;
}

signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

D. Black and White Stripe

题目

题目大意:

在这里插入图片描述

思路:双指针

枚举每个长度为k的区间,记录这个区间中黑色格子的数量,k减去它就是最少染色数,最后所有长度为k的区间的染色数取最小值即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2e5 + 10;
int n, k;
char s[N];
void solve()
{
    int ans = 1e9;
    cin >> n >> k;
    scanf("%s", s + 1);
    int l = 1;
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        cnt += s[i] == 'B';
        if (i - l + 1 == k)
        {
            ans = min(ans, k - cnt);
            cnt -= s[l++] == 'B';
        }
    }
    cout << ans << endl;
    return;
}

signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

E. Price Maximization

题目

题目大意:

在这里插入图片描述

思路:贪心+双指针

为了能够让总价值最大,那么向下取整的时候能少失去一部分就少失去一部分,让更多的价值不能因为向下取整而失去。

每个数都除于k,所以我们只需要考虑每个数求余k的部分,因为能够整除的一定会被计算上,我们只需要考虑不能被整除的即可。

因为是两个数相加一起除,所以如果存在两个余数加起来大于等于k,那么就会有更多的价值。为了又更多的价值,需要让大的余数尽量加上小的余数。

为此我们可以先将所有的余数排个序,然后利用双指针即可。

(我写的时候交了三遍才过,而且写的很复杂,写了快一个小时,首先是没想到只看余数就可以了,我是记录每个相同余数的值,然后模拟操作,所以也没想到双指针)

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2e5 + 10;
int n, k;
vector<int> v[1010];
void solve()
{
    ll ans = 0;
    cin >> n >> k;
    vector<int> v;
    for (int i = 1; i <= n; i++)
    {
        int a;
        cin >> a;
        ans += a / k;
        v.push_back(a % k);
    }
    sort(v.begin(), v.end());
    for (int i = 0, j = n - 1; i < j; i++, j--)
    {
        while (i < j && v[i] + v[j] < k)
            i++;
        if (i == j)
            break;
        ans++;
    }
    cout << ans << endl;
    return;
}

signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

加油,继续练!

相关文章
|
存储 弹性计算 算法
手把手教你使用ECS服务器搭建RssHub服务,实现“万物皆可RSS”
在当今时代,大部分人已经无法离开互联网了,由于大数据的加持,各大平台一直在竭尽全力的想我们推送我们所感兴趣的内容,但是,这样势必会造成信息茧房。是使得我们的视野越来越窄,那么有没有什么办法能够解决这个问题呢?有!在互联网发展的早期,有一个叫做RSS(简易信息聚合)的东西,这个工具可以帮你整合一些网站上的内容,当网站内容发生更新时给与通知,有点类似一个关注列表,但是这个列表中可以包含各大平台的内容。使用RSS,你可以订阅自己喜欢的内容,从而拒绝各大平台的算法推荐。给你一个“自己决定看什么的机会”!
3288 2
手把手教你使用ECS服务器搭建RssHub服务,实现“万物皆可RSS”
|
缓存 JavaScript 前端开发
Android WebView常见问题
本文主要介绍了在Android开发中WebView的使用方法,包括加载网址、设置相关属性(如JavaScript支持、缓存模式、屏幕适配等)、监听网页加载过程以及返回上一页面的功能实现。同时针对Android P版本限制明文流量的问题(ERR_CLEARTEXT_NOT_PERMITTED),提供了在`AndroidManifest.xml`中添加`android:usesCleartextTraffic=&quot;true&quot;`的解决办法。文章还附有完整代码示例,帮助开发者快速上手并解决常见问题。希望对您的开发工作有所帮助!
813 1
|
算法 安全 Go
如何通过 go 语言实现雪花算法?
在Go语言中,可通过实现雪花算法(Snowflake)生成分布式唯一ID。该算法由Twitter提出,将64位ID分为时间戳、机器ID和序列号三部分。文章介绍了算法结构、Go语言实现代码、代码说明、示例输出、优点及注意事项。此算法具备高性能、分布式支持和有序性特点,适用于数据库主键等场景。使用时需确保机器ID唯一与时钟同步。
296 0
|
Kubernetes Cloud Native Serverless
OpenKruise v1.8版本解读:解锁云原生应用管理的无限可能
OpenKruise在2025年2月发布了最新的1.8版本。此版本带来了诸多重要的更新与增强,致力于进一步提升云原生应用管理的效率、弹性和可靠性。
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
机器学习/深度学习 流计算
基于simulink的直接转矩控制方法建模与性能仿真
本研究基于Simulink实现直接转矩控制(DTC)建模与仿真,采用电压空间矢量控制及Park、Clark变换,实现电机磁场定向控制。系统通过磁链观测器、转矩估计器等模块,精确控制电机转矩和磁链,提高控制性能。MATLAB2022a版本实现核心程序与模型。
|
Dubbo 前端开发 Java
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
|
机器学习/深度学习 弹性计算 人工智能
重磅发布:云上自动化运维(CloudOps)白皮书2.0
2022年3月22日,【全新升级 阿里云ECS CloudOps 2.0来啦!】发布会正式播出,本次发布会上阿里云宣布CloudOps(云上自动化运维)套件全新升级,并发布了CloudOps云上自动化运维白皮书2.0版本。
重磅发布:云上自动化运维(CloudOps)白皮书2.0
|
算法
2021 年高教社杯全国大学生数学建模竞赛题目(D 题 连铸切割的在线优化)
连铸是将钢水变成钢坯的生产过程,具体流程如下(图 1):钢水连续地从中间包浇入结晶器,并按一定的速度从结晶器向下拉出,进入二冷段。钢水经过结晶器时,与结晶器表面接触的地方形成固态的坯壳。
1045 0
2021 年高教社杯全国大学生数学建模竞赛题目(D 题 连铸切割的在线优化)

热门文章

最新文章