Codeforces Round 924 (Div. 2)题解(A-D)

news2024/11/28 6:32:35

image-20240218202656564

A - Rectangle Cutting

链接:A - Rectangle Cutting

思路

考虑横边和纵边,若为偶数,则从中间分开,重新组合为一个长方形,检测是否与原来的长方形一致。

代码

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


inline bool test(int x, int y, int a, int b){
    if(x == a && y == b) return false;
    else if(x == b && y == a) return false;
    return true;
}

inline bool solve(int x, int y){
    if(x & 1) return false;
    return test(x, y, x / 2, y * 2);
}
int main()
{
    int T;
    cin >> T;
    while(T--){
        int a, b;
        scanf("%d%d", &a, &b);
        if(solve(a, b) || solve(b, a)){
            puts("YES");
        }
        else{
            puts("NO");
        }
    }

    return 0;
}

B - Equalize

链接:B - Equalize

思路

我们发现原本相同的元素在经过操作之后必定会变得不相同,即最终相同的元素在操作之前并不相同,所以我们可以执行去重操作。

由于分配全排列类似于阶梯,所以其可以把值为 [ k , k + n ) [k, k + n) [k,k+n) 范围内的元素进行操作,使得最终值相同。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 20;
int n;
int a[N];
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) scanf("%d", a + i);
        sort(a + 1, a + 1 + n);
        int len = unique(a + 1, a + 1 + n) - (a + 1);
        int l = 1;
        int ans = 1;

        for(int r = 1; r <= len; r ++){
            while(a[r] - a[l] >= n){
                l ++;
            }
            ans = max(ans, r - l + 1);
        }
        printf("%d\n", ans);
    }

    return 0;
}

C - Physical Education Lesson

链接:C - Physical Education Lesson

题意

总共有 n n n 个人,有个参数 k k k ,从前往后依次给这些人分配序号,序号的分配规则如下:

  • k 个人的号码是 1 , 2 , 3 , … , k 1,2,3,…,k 1,2,3,,k
  • 接下来 k − 2 k-2 k2 个人的号码为 k − 1 , k − 2 , … , 2 k−1, k−2, …, 2 k1,k2,,2
  • 然后以 2 k − 2 2k - 2 2k2 为周期,依次给剩下位置的人分配指标

现在知道一个人的位置和这个人所得到的指标,k 的可能取值范围有多少个?

思路

分为一下两种情况:

由于周期为 2 k − 2 2k - 2 2k2 ,所以统统把位置通过取模运算转化到前 2 k − 2 2k - 2 2k2 个等价的位置。

①这个人得到的指标位于正序的情况中(1,2,3,…,k)【void yinsu1(int x)】

转化位置:
( n − 1 ) % ( 2 k − 2 ) + 1 = x (n - 1)\%(2k-2)+1=x (n1)%(2k2)+1=x
即:
( n − 1 ) % ( 2 k − 2 ) = x − 1 (n - 1)\%(2k-2)=x-1 (n1)%(2k2)=x1
x ≤ k x \le k xk ,则有得 x − 1 < 2 k − 2 x-1 < 2k-2 x1<2k2 ,所以有同余关系:
n − 1 = x − 1 m o d    ( 2 k − 2 ) n − x = 0 m o d    ( 2 k − 2 ) n - 1=x-1\mod (2k-2) \\ n - x= 0 \mod (2k-2) \\ n1=x1mod(2k2)nx=0mod(2k2)
( n − x ) (n-x) (nx) 可以整除 2 ( k − 1 ) 2(k - 1) 2(k1) 的时候,那么就成立。

所以应该求 ( n − x ) 2 \frac{(n-x)}{2} 2(nx)的所有因数,k即为 因数 + 1 因数+1 因数+1

时间复杂度为 O ( n ) O(\sqrt{n}) O(n )

②这个人得到的指标位于倒序的情况中(k−1, k−2, …, 2)【void yinsu2】

在这种情况下, x x x 自然就不可能为 k k k 或者是 1 1 1

与上面类似,可以得出等式:
( n − 1 ) % ( 2 k − 2 ) + 1 = 2 k − x (n - 1)\% (2k-2)+1=2k -x (n1)%(2k2)+1=2kx
即:
( n − 1 ) % ( 2 k − 2 ) = 2 k − x − 1 (n - 1)\% (2k-2)=2k -x-1 (n1)%(2k2)=2kx1
由于 x 不可能为 1,且为自然数,那么有 2 k − 2 < 2 k − 1 − x 2k-2 < 2k-1-x 2k2<2k1x

故有:
n − 1 = 2 k − x − 1 m o d    ( 2 k − 2 ) n + x − 2 k = 0 m o d    2 ( k − 1 ) n - 1=2k -x-1 \mod (2k-2) \\ n +x-2k=0 \mod 2(k-1) \\ n1=2kx1mod(2k2)n+x2k=0mod2(k1)
所以需要求使得 n + x − 2 k n+x-2k n+x2k 可以被 2 ( k − 1 ) 2(k - 1) 2(k1) 整除的 k 的个数

设做除法之后的商为 t,则有:
n + x − 2 k 2 ( k − 1 ) = t n + x 2 − k ( k − 1 ) = t n + x 2 − k = k t − t k ( 1 + t ) = n + x 2 + t k = n + x 2 + t 1 + t k = n + x 2 − 1 + ( t + 1 ) t + 1 \frac{n+x-2k}{2(k-1)}=t\\ \frac{\frac{n+x}{2}-k}{(k-1)}=t\\ \frac{n+x}{2}-k=kt-t\\ k(1+t)=\frac{n+x}{2}+t\\ k = \frac{\frac{n+x}{2}+t}{1+t}\\ k = \frac{\frac{n+x}{2}-1+(t+1)}{t+1}\\ 2(k1)n+x2k=t(k1)2n+xk=t2n+xk=kttk(1+t)=2n+x+tk=1+t2n+x+tk=t+12n+x1+(t+1)
此时,仅仅需要找 n + x 2 − 1 \frac{n+x}{2}-1 2n+x1 的因数,然后有:
k = n + x 2 − 1 因数 + 1 k=\frac{ \frac{n+x}{2}-1 }{因数}+1 k=因数2n+x1+1
由于有 x ≤ k x \le k xk,并且 k 可能会重复,所以进行去重,并且仅仅考虑大于等于 x 的 k

代码

#include <bits/stdc++.h>
using namespace std;
vector<int> ans;
int n, x;
void yinsu1(int x){// 考虑了1这一个因数, 正常求得所有的因数,然后放在数组中
    
    for(int i = 1; (long long)i * i <= (long long)x; i++){
        if(x % i == 0){
            if((long long)i * i == (long long)x) ans.push_back(i + 1);
            else {
                ans.push_back(i + 1);
                ans.push_back(x / i + 1);
            }
        }
    }
    return;
}

void yinsu2(int x){
    for(int i = 1; (long long)i * i <= (long long)x; i++){
        if(x % i == 0){
            if((long long)i * i == (long long)x) ans.push_back(x / i + 1);
            else {
                ans.push_back(x / i + 1);
                int tmp = (x / i);
                ans.push_back(x / tmp + 1);
            }
        }
    }
}
int main()
{
    int T;
    cin >> T;
    while(T--){
        ans.clear();
        scanf("%d%d", &n, &x);
        if(x > n) {// 不可能
            puts("0");
            continue;
        }
        // 计算在正序范围内的
        if(!((n - x) & 1))
            yinsu1(abs(n - x) / 2);
        if(x != 1 && x != n && !((n + x) & 1))// 倒序中不含1和n
            yinsu2(abs(n + x) / 2 - 1);

        sort(ans.begin(), ans.end());
        ans.erase(unique(ans.begin(), ans.end()), ans.end());
        int cnt = 0;
        for(int _ : ans){
            if(_ >= max(2, x)) cnt++;
        }
        printf("%d\n", cnt);
    }
    return 0;
}

D - Lonely Mountain Dungeons

链接:D - Lonely Mountain Dungeons

题意

有n个不同的种群,每一个种群中的生物数量为c[i].

假设现在有 t 个分队,那么计算总兵力的方法如下:

  1. 针对每一种种群,当有一对生物处于两个小队,那么战斗力会增加 b
  2. 减去 x ( t − 1 ) x(t-1) x(t1)

思路

最重要的是有一个温馨提示:

保证所有测试用例的数值 c 1 + c 2 + … + c n c_1 + c_2 + \ldots + c_n c1+c2++cn 之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

这样使得我们可以进行暴力。

①单独对于某一种群,查看如何分配,才可以使得这一种种群的战斗力最大

我们可以采用移动法:

把某一小队的一个生物移动到其他分队,查看其总贡献的变化。

经过推敲,我们容易知道,当把一个生物从A队移动到B队,当且仅当A队的生物的数量个数(不包含移动的那一个)多余B队生物数量(不包含移动的那一个)时,才会更加有意义。

所以合理的排布为:

  1. 先给每一小队分配 ⌊ c [ i ] t ⌋ \lfloor \frac{c[i]}{t} \rfloor tc[i]
  2. 然后把剩余的给每一小队分一个,直到分完。

②如何计算某一种群按照①的方法分配之后的贡献值

根据数学知识,知道:
C k − c   m o d   k 2 ⋅ y 2 + C c   m o d   k 2 ⋅ y ′ 2 + ( k − c   m o d   k ) ⋅ ( c   m o d   k ) ⋅ y ⋅ y ′ C_{k - c \bmod k}^2 \cdot y^2 + C_{c \bmod k}^2 \cdot y'^2 + (k - c \bmod k) \cdot (c \bmod k) \cdot y \cdot y' Ckcmodk2y2+Ccmodk2y′2+(kcmodk)(cmodk)yy
其中 y = ⌊ c k ⌋ y = \left\lfloor \frac{c}{k} \right\rfloor y=kc y ′ = ⌈ c k ⌉ y' = \left\lceil \frac{c}{k} \right\rceil y=kc.

③时间复杂度问题

当 $t > c[i] $ 的时候,我们发现这个种群的贡献最多为 t = = c [ i ] t==c[i] t==c[i] 时候的情况,这个时候,我们就没有必要计算 $t > c[i] $ 的时候这个种群的贡献,仅仅需要通过add数组记录即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, b, x;
const int N = 2e5 + 20;
int a[N];

int cnt[N];
int add[N];
int getPair(int n, int k){
    int x = n / k;
    int y = n % k;
    return    (x+1) * (x+1) * (y*(y-1))/2
            + x * x * (k-y)*(k-y-1)/2
            + (x+1) * x * (y) * (k - y);
}
void solve(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= a[i]; j++){
            cnt[j] += getPair(a[i], j);
        }
        add[a[i]] += getPair(a[i], a[i]);
    }
}

void init(int maxv){
    for(int i = 1; i <= maxv + 1; i++){
        add[i] = 0;
        cnt[i] = 0;
    }
}
signed main()
{
    int T;
    cin >> T;
    while(T--){
        scanf("%lld%lld%lld", &n, &b, &x);
        for(int i = 1; i <= n; i++) scanf("%lld", a + i);
        int maxv = 0;
        for(int i = 1; i <= n; i++){
            maxv = max(maxv, a[i]);
        }
        init(maxv);
        solve();
        int ans = 0;
        int other = 0;
        for(int i = 1; i <= maxv; i++){
            ans = max(ans, (cnt[i] + other) * b - (i - 1) * x);
            other += add[i];
        }
        printf("%lld\n", ans);
    }

    return 0;
}

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

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

相关文章

湖南建研工程质量检测系统/Scripts/admintool文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2.C语言——输入输出

1.字符输入输出函数 1.输入:getchar() 字面意思&#xff0c;接收单个字符&#xff0c;使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式&#xff1a; scanf(“格式控制…

lvs DR模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群

lvs DR模式基于五台服务器部署keepalived lvs DR模式架构(前端带路由)负载均衡的高可用集群 DR模式一&#xff1a; 客户端&#xff1a;172.20.26.167 LVS服务器&#xff1a;172.20.26.198 后端服务器&#xff1a;172.20.26.218 后端服务器&#xff1a;172.20.26.210 两台…

day05-股票数据采集功能

股票数据采集 今日目标 1.掌握RestTemplate基本使用; 2.阅读并理解第三方股票接口API; 3.基于RestTemplate实现国内大盘数据采集功能; 3.1 项目集成RestTemplate; 3.2 理解基于正则解析响应数据原理; 3.3 掌握常用lambda stream流操作; 4.基于RestTemplate实现国内板块和股票…

浅析SPDK技术:vhost

文章目录 SPDK vhost工作机制SPDK vhost实现SPDK vhost设备管理结构vhost_dev_register&#xff1a;注册vhost设备new_connection&#xff1a;新建连接会话start_device&#xff1a;启动设备会话 SPDK vhost-blk实现rpc_vhost_create_blk_controller&#xff1a;创建vhost-blk设…

Feign 第一次调用为什么会很慢?

前言 首先要了解 Feign 是如何进行远程调用的&#xff0c;这里面包括&#xff0c;注册中心、负载均衡、FeignClient 之间的关系&#xff0c;微服务通过不论是 eureka、nacos 也好注册到服务端&#xff0c;Feign 是靠 Ribbon 做负载的&#xff0c;而 Ribbon 需要拿到注册中心的…

融智学应用场景实训实操文化基因系统工程实践指南讲座音频

俗话说&#xff0c;听君一席话胜读十年书。戴上耳机闭目倾听&#xff08;语言哲学和语言科学基础之上的融智学&#xff09;&#xff1a; “融智学应用场景实训实操文化基因系统工程实践指南讲座音频”&#xff08;一共七章&#xff09;随之便会发现&#xff0c;原来汉字汉语暨…

卫星热平衡试验与太阳光模拟器

卫星热模型是一种用于研究卫星的热特性的模型。卫星在太空中接收到的太阳辐射会导致其表面温度的变化&#xff0c;而表面温度的变化会影响卫星的热传导和热辐射&#xff0c;进而影响其冷却和热平衡。 卫星热模型一般涉及以下几个方面的内容&#xff1a; 1. 热辐射模型&#xf…

Midjourney风格一致功能解读及使用方法

Midjourneys再次迎来更新&#xff0c;本次新增“风格一致”功能&#xff01;用户期待已久的风格模仿功能终于实现了&#xff01; --sref 虽然目前只是测试功能&#xff0c;但已经相当强大了&#xff0c;这篇文章我将带大家先睹为快&#xff01; 别忘了&#xff0c;这个功能目前…

C语言第二十七弹---内存函数

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数&…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和…

【技能树学习】Markdown入门——练习题解析

文章目录 前言1 MarkDown介绍2 段落及强调3 标题4 链接5 图片6 列表7 分割线及引用8 代码块9 表格 前言 本篇文章给出了CSDN Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry…

深圳市金航标电子有限公司,获得多项发明专利,国家高新技术企业

深圳市金航标电子有限公司&#xff0c;获得多项发明专利,国家高新技术企业&#xff0c;“中国卫星导航定位协会”、“广东连接器协会”会员。技术团队来自清华大学和电子科技大学&#xff0c;已取得ISO9001认证和欧盟标准RoHS、REACH认证。“金航标&#xff0c;连接世界”&…

VSCode无法连接远程服务器的两种解决方法

文章目录 VSCode Terminal 报错解决方式1解决方式2you are connected to an OS version that is unsupported by Visual Studio Code解决方法 VSCode Terminal 报错 直接在terminal或cmd中使用ssh命令可以连接服务器&#xff0c;但是在vscode中存在报错&#xff0c;最后一行为…

KNN算法总结

概述 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是K个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法…

备战蓝桥杯---动态规划(入门3之子串问题)

本专题再介绍几种经典的字串问题。 这是一个两个不重叠字串和的问题&#xff0c;我们只要去枚举分界点c即可&#xff0c;我们不妨让c作为右区间的左边界&#xff0c;然后求[1,c)上的单个字串和并用max数组维护。对于右边&#xff0c;我们只要反向求单个字串和然后选左边界为c的…

真怕了,冻雨天气没有雪地胎怎么活

文 | AUTO芯球 作者 | 王秦 南方过年太苦了 刚暖和2天 又开启冻雨模式 过年前的冰冻阴影还没过去啊 这车都不敢开出去了啊 冰冻天气&#xff0c;雪天行车是一件很考验技术和运气的事情啊&#xff0c; 因为什么&#xff1f; 滑&#xff0c;对吧。 那么有哪些装备可以让…

如何找回丢失照片? 7 种免费照片恢复方法分享

照片可以勾起回忆&#xff0c;让我们想起与最亲近的人一起度过的时光&#xff0c;这就是为什么仅仅丢失一张重要照片就会让人感觉完全毁灭性的——几乎就像你失去了记忆本身一样。好消息是&#xff0c;大多数丢失或意外删除的照片都可以使用照片恢复软件恢复&#xff0c;而且我…

做外贸的你是如何看待2024?

说到2024年的市场行情&#xff0c;有人说会比2023年要好很多。也有人说可能还不如去年&#xff0c;竞争可能会更加的激烈。 而且从各个博主的观点看来&#xff0c;俄罗斯市场似乎成了一个比较热门的话题&#xff0c;有人说今年我们大家应该主攻俄罗斯市场&#xff0c;现在俄罗斯…

云原生之容器管理工具Portainer

1. 简介 前面文章我们讲Docker、Docker Compose和Docker Swarm都是在Linux系统上手工命令行去操作&#xff0c;在第一次安装的时候可以命令行&#xff0c;以后运维和CICD流程操作中&#xff0c;如果还要命令行去各个节点操作&#xff0c;操作就麻烦了&#xff0c;工作效…