Educational Codeforces Round 164 (Rated for Div. 2) A-E

news/2024/5/18 16:55:15

A. Painting the Ribbon

在这里插入图片描述
暴力模拟即可

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n,m,k;cin>>n>>m>>k;vector<int> a(n+5);int f=0;for(int i=1;i<=n;i++){a[i]=f;f=(f+1)%m;}int cnt=0;for(int i=1;i<=n;i++){if(a[i]!=0) cnt++;}if(cnt>k) cout<<"YES"<<endl;else cout<<"NO"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);// cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

B. Make It Ugly

在这里插入图片描述
思路:显然,当一个数组的开头和结尾不同时,其一定是不好的,我们思考,是否存在其他方式让数组变得不好,自己造几组样例手玩一下就会发现,当数组中存在两个不同的数,并且这两个数相邻,且不等于数组开头/结尾时,这个数组是不好的,所以我们把数组变得不好的方式有三种:
其一是让数组的开头和结尾不同,其二便是让两个不同的数相邻。
按照上述策略进行贪心即可。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n;cin>>n;vector<int> a(n+5);map<int,int> mp;for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;int cnt=n;if(mp.size()==1) {cout<<-1<<endl;return ;}int last=0;for(int i=1;i<=n;i++){if(a[i]!=a[1]){cnt=min(cnt,i-last-1);last=i;}}cnt=min(cnt,n-last);cout<<cnt<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);// cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

C. Long Multiplication

在这里插入图片描述
思路:这种题目一般是具有什么性质,对于给定的两个数,我们容易发现,无论两个数的数位如何交换,其和不会改变,那么令 x + y = c x+y=c x+y=c , x = c − y x=c-y x=cy,对于给定的 x × y x\times y x×y,我们可以表示为 f = ( c − y ) × y f=(c-y)\times y f=(cy)×y,容易得到,当 x = c / 2 x=c/2 x=c/2时,整个式子会得到最大值,那么此时的 x x x y y y 相等,所以我们想让 f ( x ) f(x) f(x)的值越大,那么 x x x y y y的差值就要越小,因此贪心的去构造交换即可。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{string a,b;cin>>a>>b;for(int i=0;i<a.size();i++){if(a[i]==b[i]) continue;else if(a[i]<b[i]){for(int j=i+1;j<a.size();j++){if(a[j]<b[j]) swap(a[j],b[j]);}break;}else if(a[i]>b[i]){for(int j=i+1;j<a.size();j++) if(a[j]>b[j]) swap(a[j],b[j]);break;} }cout<<a<<endl;cout<<b<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);// cout.tie(0);int t;t = 1;cin >> t;while (t--){solve();}system("pause");return 0;
}

D. Colored Balls

在这里插入图片描述
思路:考虑一组的贡献,容易得到,定义一组的总个数为 s u m sum sum,最大值为 m x mx mx, 那么这一组的贡献为 m i n ( m x , ( s u m + 1 ) / 2 ) min(mx,(sum+1)/2) min(mx,(sum+1)/2),为什么呢,
当除最大值之外的所有值之和小于最大值时,我们为了保证一组内每种颜色的球不超过 1 个,那么至少得分出 m x mx mx组。
当其大于最大值时,贡献为 ( s u m + 1 ) / 2 (sum+1)/2 (sum+1)/2,这样保证是最小的,为什么呢,我们每次将数组中的最大值和次大值减一,最后只会剩下1个或0个,因此向上取整即可。
计算完一组的贡献,我们考虑如何进行 2 n 2^n 2n组,当我们放入 a i a_i ai时,我们无法确定此时具体的贡献,所以我们很容易想到,对a数组进行从小到大的排序,然后使用 f [ k ] f[k] f[k]表示总和为 k k k时的方案数,因为知道了当前总和,所以我们枚举 a i a_i ai即可。
具体的方案数则是可以用背包进行维护,有时候对于这种每个数选或是不选从而构成 2 n 2^n 2n级别的题目,则可以考虑背包,同时对于背包问题,当其数据范围过小时,我们是可以用状压去解决背包问题的,即用一个二进制数去枚举当前这一位选或是不选。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"template<const int T>
struct ModInt {const static int mod = T;int x;ModInt(int x = 0) : x(x % mod) {}ModInt(long long x) : x(int(x % mod)) {} int val() { return x; }ModInt operator + (const ModInt &a) const { int x0 = x + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }ModInt operator - (const ModInt &a) const { int x0 = x - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }ModInt operator * (const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator / (const ModInt &a) const { return *this * a.inv(); }bool operator == (const ModInt &a) const { return x == a.x; };bool operator != (const ModInt &a) const { return x != a.x; };void operator += (const ModInt &a) { x += a.x; if (x >= mod) x -= mod; }void operator -= (const ModInt &a) { x -= a.x; if (x < 0) x += mod; }void operator *= (const ModInt &a) { x = 1LL * x * a.x % mod; }void operator /= (const ModInt &a) { *this = *this / a; }friend ModInt operator + (int y, const ModInt &a){ int x0 = y + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }friend ModInt operator - (int y, const ModInt &a){ int x0 = y - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }friend ModInt operator * (int y, const ModInt &a){ return ModInt(1LL * y * a.x % mod);}friend ModInt operator / (int y, const ModInt &a){ return ModInt(y) / a;}friend ostream &operator<<(ostream &os, const ModInt &a) { return os << a.x;}friend istream &operator>>(istream &is, ModInt &t){return is >> t.x;}ModInt pow(int64_t n) const {ModInt res(1), mul(x);while(n){if (n & 1) res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}if (u < 0) u += mod;return u;}};
using mint = ModInt<998244353>;mint dp[N];void solve()
{int n;cin>>n;vector<int> a(n+5);for(int i=1;i<=n;i++) cin>>a[i];sort(a.begin()+1,a.begin()+1+n);mint ans=0;dp[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=5000;j++){if(j<=a[i]) ans+=dp[j]*a[i];else ans+=dp[j]*((j+a[i]+1)/2);}for(int j=5000;j>=a[i];j--) dp[j]+=dp[j-a[i]];//对当前ai去跑背包即可}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);// cout.tie(0);int t;t = 1;// cin >> t;while (t--){solve();}system("pause");return 0;
}

同时可以将d题改变一下,同样是计算 2 n 2^n 2n组,但每一组的贡献为该组的最大值,计算最后的答案。
这样就将a数组从大到小进行排序,考虑当前 a i a_i ai对答案的贡献即可。

E. Chain Reaction

在这里插入图片描述
ok又是经典问题
思路:我们考虑 k = 1 k=1 k=1的情况,那么对于每个 a i a_i ai而言,其只有在 a i > a i − 1 a_i>a_{i-1} ai>ai1时,才会产生贡献,所以整个序列的贡献为: ∑ i = 1 i = n m a x ( 0 , a i − a i − 1 ) \sum_{i=1}^{i=n}max(0,a_i-a_{i-1}) i=1i=nmax(0,aiai1)
那么我们考虑 k k k 等于任意值的情况,显然为 m a x ( ⌈ a i k ⌉ − ⌈ a i − 1 k ⌉ , 0 ) max(\lceil {a_i\over k} \rceil-\lceil {a_{i-1}\over k} \rceil,0) max(⌈kaikai1,0)
因此对于上述的情况, a i a_i ai的贡献为+1, a i − 1 a_{i-1} ai1的贡献为-1,我们统计每个位置对应的贡献即可。
最后应该如何进行计算呢,我们会发现当 a i a_i ai处于某个区间时,其 a i k a_i\over k kai的值是一定的,所以我们可以枚举这个定值 x x x,从而得到当 a i a_i ai处于 [ ( x − 1 ) ∗ k + 1 , x ∗ k ] [(x-1)*k+1,x*k] [(x1)k+1,xk],其值是一定的。最后便可以得到答案。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
// int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n;cin>>n;vector<int> a(n+5);for(int i=1;i<=n;i++) cin>>a[i];int mx=*max_element(a.begin()+1,a.begin()+1+n);vector<ll> c(N);for(int i=1;i<=n;i++) {if(a[i]>a[i-1]) c[a[i]]++,c[a[i-1]]--;//计算每个值对应的贡献}for(int i=1;i<=mx;i++) c[i]+=c[i-1];//因为我们需要进行区间计算,所以先得算出前缀和for(int i=1;i<=mx;i++){ll res=0;for(int j=1;j<=(mx+i-1)/i;j++){//即枚举上文所说的x,res+=j*(c[min(j*i,mx)]-c[(j-1)*i]);}cout<<res<<" ";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;// cin >> t;while (t--){solve();}system("pause");return 0;
}

http://www.mrgr.cn/p/73726634

相关文章

国密SSL证书在等保、关保、密评合规建设中的应用

在等保、关保、密评等合规建设中&#xff0c;网络和通信安全方面的建设是非常重要的部分&#xff0c;需要实现加密保护和安全认证&#xff0c;确保传输数据机密性、完整性以及通信主体可信认证。国密SSL证书应用于等保、关保和密评合规建设中&#xff0c;不仅能够提升网络信息系…

排序5-快速排序

排序5-快速排序快速排序(正序) 利用分而治之的思想+挖坑填数排序, 选择一个基准数, 将小于基准数的元素全部放在基准数左边, 大于基准数的元素全部放在基准数右侧.再对剩下的部分进行快速排序快速排序c++实现(正序) //快速排序(正序) void quickSort(int arr[], int start, int…

自己写的爬虫小案例

网址&#xff1a;aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

云原生:10分钟了解一下Kubernetes架构

Kubernetes&#xff0c;作为当今容器编排技术的事实标准&#xff0c;以其强大的功能和灵活的架构设计&#xff0c;在全球范围内得到了广泛的应用和认可。本文将深入简出地探讨Kubernetes的核心架构&#xff0c;帮助大家了解Kubernetes&#xff0c;为今后的高效的学习打下良好的…

Java高级阶段面试题库(Redis数据库、MQ消息队列、kafka、SpringBoot + SpringCloud、MySQL、JVMJUC、其它)

文章目录 1. Redis数据库篇(忽略)1.1 简单介绍一下redis1.2 单线程的redis为什么读写速度快?1.3 redis为什么是单线程的?1.4 redis服务器的的内存是多大?1.5 为什么Redis的操作是原子性的&#xff0c;怎么保证原子性的&#xff1f;1.6 你还用过其他的缓存吗&#xff1f;这些…

【AI写作】未来科技趋势:揭秘DreamFusion的革新力量

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

windows 11系统下打开docker 提示 docker engine stopped

windows 11系统下打开docker 提示 docker engine stopped 参考链接:https://zhuanlan.zhihu.com/p/663821762 装好了docker for windows以后,点开发现界面中心一直提示docker engine stopped,按照很多方法都不行,后面再知乎的一个专栏里面找到了解决方法 总结来说就是检查几…

「JavaEE」线程状态

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程状态 &#x1f349;start 和 run 的区别&#x1f349;终止线程&#x1f349;join & 阻塞状态&#x1f349;线程六大状态 &…

双向循环链表:(创建、插入、遍历、求长、查找、删除、排序、销毁)待测

目录一、双向循环链表存在的意义二、节点的定义三:实现1:创建链表(即创建一个空链表)2:创建新结点3:遍历4:插入头插入尾插入中间插入 一、双向循环链表存在的意义 数组这样的结构提供了连续内存的访问和使用,链表是对内存零碎空间的有效组织和使用,双向循环链表增大了访…

电脑控制手机的工具 挺好用 不收费

# gitee地址 https://gitee.com/Barryda/QtScrcpy?utm_source=alading&utm_campaign=repo#https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fbarry-ran%2FQtScrcpy%2Freleases建议选择国外下载,不用注册码云账号

Fork for Mac v2.42 激活版 Git客户端

Fork for Mac是一款运行在Mac平台上的Git客户端&#xff0c;Fork Mac版具备基本的取、推、提交、修改、创建和删除分支和标签、创建和删除远程备份等功能&#xff0c;还有实用的差异查看器&#xff0c;你可以通过清晰的视图快速发现源代码中的更改。 Fork for Mac v2.42 激活版…

网卡-频段、信道、带宽

频段 在无线通信领域中,网卡频段是指所支持的无线通信频率范围,主要是指2.4G、5G2.4GHz频段:这是最常见的无线通信频段之一,一般用于Wi-Fi网络和蓝牙等。2.4GHz频段在各个地区都是通用的。5GHz频段:这也是用于Wi-Fi网络的一个常见频段,相对于2.4GHz频段,5GHz频段拥有更多…

延迟绑定与retdlresolve

延迟绑定与retdlresolve我们以前在ret2libc的时候,我们泄露的libc地址是通过延迟绑定实现的,我们知道,在调用libc里面的函数时候,它会先通过plt表和gor表绑定到,函数真实地址上,那么在第二次调用的时候就可以用了,不用再次绑定 那么它是怎么样实现的呢,我们还是通过一个…

allegro输出正反面bom

不是前面两条命令&#xff0c;而是component report

网络基础(day3)建议在电脑端注册登陆观看!!!

【 理论重点】 网络是什么&#xff1f; &#xff08;网络是载体&#xff0c;目的是传输互联网中的数据&#xff0c;数据是终端产生<手机、电脑、服务器等>。&#xff09; 如何组件网络&#xff08;良性网络架构&#xff09;&#xff1f;有网络架构思维&#xff0c;得按层…

Golang - 并发同步更新全局切片失败的原因以及解决方案

当多个协程同时访问和修改同一个共享资源(如切片)时,如果没有适当的同步机制,可能会导致数据竞争和不一致的结果。package mainimport ("fmt""sync" )func processChunk(chunk []int64, wg *sync.WaitGroup, failedList []int64) {defer wg.Done()fmt.…

Golang - 同步更新全局切片失败的原因以及解决方案

当多个协程同时访问和修改同一个共享资源(如切片)时,如果没有适当的同步机制,可能会导致数据竞争和不一致的结果。package mainimport ("fmt""sync" )func processChunk(chunk []int64, wg *sync.WaitGroup, failedList []int64) {defer wg.Done()fmt.…

SpringCloud-MQ

【BV1LQ4y127n4】同步通讯和异步通讯 微服务间通讯有同步和异步两种方式。同步通讯就像打电话,需要实时响应;异步通讯就像发邮件,不需要马上回复。两种方式各有优劣,打电话可以立即得到响应,但是却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会…