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

news2024/12/22 4:46:44

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.coloradmin.cn/o/1620874.html

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

相关文章

Maven的基础使用

1 Maven概述 引入案例&#xff1a;idea创建javaWeb项目&#xff0c;如何打包并发布tomcat上去&#xff0c;以便于客户端访问&#xff1f; 方案一&#xff1a;DOS命令完成打包&#xff0c;操作性不方便&#xff0c;代码频繁修改&#xff0c;频繁使用命令打包一阶段可以打包&am…

SHELL脚本(全是干货)

一、shell是什么&#xff1f; 1. 1 shell 是一种脚本语言 脚本语言的本质是一个文件&#xff0c;文件里面存放的是特点格式的指令&#xff0c;系统可以使用脚本解析器翻译或者解析指令&#xff0c;并且执行&#xff08;它不需要编译&#xff09; shell 即是应用程序&#xff…

【Linux】Linux权限管理详解

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 1. Linux权限概念2. 文件访问者分类a) 文件和目录的访问者&#xff1a;b) 文件类型和访问权限 3. 文件权限值的表…

Linux的磁盘分区,格式化,挂载

1.需要提前添加几个磁盘&#xff0c;以做实验 2.把nvme0n2磁盘用来分区实验 3.分了一个主分区&#xff0c;和一个扩展分区&#xff08;扩展分区是不能使用的&#xff0c;所以又在扩展分区里分了一个逻辑分区&#xff09;分区的大小自己定义 4.格式化分出来的区&#xff0c;这…

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程 xgp游戏平台是微软公司针对pc用户开发的一款游戏平台&#xff0c;在平台内有着知名的月包服务&#xff0c;玩家们只需每个月支付固定的费用&#xff0c;即可免费玩到不同的游戏大作&#xff0c;xgp平台也正是由月包服务…

1.C++入门(下)

目录 1.引用和指针 2.内联函数 2.1 概念&#xff1a; 2.2 特性&#xff1a; 2.3 与宏对比 3.auto关键字 3.1 简介&#xff1a; ​3.2 使用&#xff1a; 3.3 局限 4.基于范围的for循环 1.引用和指针 因为这个面试中常考&#xff0c;就接着上一篇&#xff0c;把这个放…

Linux 底软开发——对CAN的详细操作(周期发送,异常检测,过滤报文)

Linux底软开发—对CAN发送接收详细操作 文章目录 Linux底软开发—对CAN发送接收详细操作1.保证多条CAN数据发送的周期性2.解析CAN报文数据3.CAN总线异常机制应对4.对CAN报文进行过滤操作5.完整的接收报文代码&#xff08;过滤&#xff0c;心跳检测&#xff0c;解析&#xff09;…

刚刚,百度真来炸场了!

文章目录 前言再看文心智能体开发工具&#xff1a;AgentBuilderAI原生应用开发工具&#xff1a;AppBuilder各种尺寸的模型定制工具&#xff1a;ModelBuilder结语 前言 不知道大家还记得不&#xff0c;去年 ChatGPT 火遍全球的时候&#xff0c;国内率先推出 AI 大模型的是百度家…

【热门话题】AI作画算法原理解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 AI作画算法原理解析AI作画算法概述基础原理&#xff1a;机器学习与深度学习卷积…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

基于Kepware的Hadoop大数据应用构建-提升数据价值利用效能

背景 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它允许用户在不需要深入了解分布式底层细节的情况下&#xff0c;开发分布式程序。Hadoop充分利用集群的威力进行高速运算和存储&#xff0c;特别适用于处理超大数据集。 Hadoop的生态系统非常丰富&…

【如何使用chrome开发者工具调试javascript代码】

创作背景 平常开发时我们去解决bug可能会用console.log来来调试&#xff0c;但是断点可以更快地完成工作。 log调试的劣势&#xff1a;但是使用console.log时需要我们手动的打开源码&#xff0c;找到相关代码&#xff0c;插入log语句&#xff0c;然后重新加载页面&#xff0c…

【MySQL】数据库操作指南:数据类型篇

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;MySQL探险日记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 文章目录 1. 数值类型1.1 tinyint 类型1.2 bit 类型1.3 小数类型1.3.1 f…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

顺序表的应用-通讯录

顺序表的应用-通讯录 1.操作2.功能要求2.1.功能要求2.2.思路小结2.3.文件梳理2.4.代码实现"SeqList.h""Contact.h""SeqList.c""Contact.c""test.c" 1.操作 链接: 顺序表专题 这篇文章介绍了顺序表的概念与基本操作。 本文将…

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓

54位大咖演讲精华&#xff01; 中国生成式AI大会圆满收官&#xff0c;TOP50企业榜单揭晓© 由 红板报 提供 智东西4月19日报道&#xff0c;为期两天的2024中国生成式AI大会&#xff0c;今日在京圆满收官。 54位产学研投嘉宾代表全程干货爆棚&#xff0c;报名咨询人数逾52…

机械臂模型更换成自己的urdf模块

1.将urdf生成slx文件 smimport(rm_65_flange.urdf);%生成Simscape物理模型 2.更换joint部分&#xff08;对应与几个输入几个输出&#xff09;&#xff08;依次更换&#xff09; 3.更改关节部分&#xff08;依次更换&#xff09; 找到urdf文件夹下的meshes文件夹&#xff0c;看…

python爬虫 - 爬取 json 格式数据(股票行情信息:雪球网,自选股)

文章目录 1. 第一步&#xff1a;安装requests库2. 第二步&#xff1a;获取爬虫所需的header和cookie3. 第三步&#xff1a;获取网页4. 第四步&#xff1a;解析网页5. 第五步&#xff1a;解析 json 结构数据体6. 代码实例以及结果展示 python爬虫五部曲&#xff1a; 第一步&…

Window + Ubuntu 双系统无Ubuntu Bios 启动项

文章目录 安装硬盘位置不重要&#xff01;&#xff01;&#xff01;&#xff08;但是我安装在了第二张HDD&#xff09;问题是多盘分位置会导致磁盘主分区变成了简单卷 Bios Ubuntu 启动项修复参考Ubuntu安装U盘进入Try Ubuntu 使用Terminal修复完提示Disable Secure Boot进入Te…

sublime运行编译C和Java

1.先安装终端 参照以下教程 如何在 Sublime 文本编辑器中使用终端&#xff1f;_sublime终端窗口怎么打开-CSDN博客 可能遇到的问题&#xff1a;有些sublime text3可能并没有显示“package control”。这个问题对于笔者来说是有些吊诡的&#xff0c;因为之前一开始安装时是能…