Week 3 DAY 5:

news2024/9/20 16:35:30

Game on Ranges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Game on Ranges

这道题题目意思有点难理解,加上是英文提面,这里解释一下,有两个人A和B,

一开始给定一个n,是1到n的排列,A人负责选取区间,B负责在该区间选一个数删掉,操作n次,也就把区间里的数全部都删掉了。题目给出了A每次选择的区间,要求B人,在A给出的区间中,B删去了哪些点

讲解一下其中一个样例(样例三)

输入样例:
6
1 1
3 5
4 4
3 6
4 5
1 6

输出样例:(这道题输出顺叙不做要求)

1 1 1
3 5 3
4 4 4
3 6 6
4 5 5
1 6 2

给定的是一个长度为6的数组

1.A:选过1 1的区间,那么此时B一定只能选取数字1给他删掉

2.接着A:选了3  5的区间,B要删掉一个数,这里B可以删掉3 4 5,此时不确定 B要删几,继续往下;

3.A选择了4 4的区间,同样的B只能删掉数字4;

4.A选择了数字 3 6 的区间,B可以选择 3 5 6,为什么没有4,因为第3步已经选走了。

5.A选择了4 5 区间,因为4 被选走了,B只能选择5;

6 A选择了1 6 区间,此时B能选2 3 6;、

我们倒回去看那些B步确定删掉的第2步,第4步,和第六步;

第二步在看只能删掉3,第四步只能删掉6,第六步只能删掉2;

所以根据A给出的区间;

就可以的代输出样例;

1 1 1

4 4 4

4 5 5

3 5 3

3 6 6

1 6 2

那么我们就可以先删掉区间最短的那一个组合,因为他们可以选择的数字是最少得;

所以我们可以写一个结构体数组对区间长度进行排序;依次确定每个区间B会删掉什么数字;

标记,保证每个区间删掉的数字不相同;

AC:

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct nod{
	int r;
	int l;
	int d;
}a[1005];
int vis[1005];

bool cmp(nod x,nod y){
	return x.d<y.d;
}

signed main(){
	int t;
	cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis));
		memset(a,0,sizeof(a));
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i].l>>a[i].r;
			a[i].d=a[i].r-a[i].l+1;
		}
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=n;i++){
	//	cout<<endl;
		//cout<<"i: "<<i<<" "<<a[i].l<<" "<<a[i].r<<endl;;
			if(a[i].l==a[i].r){
				vis[a[i].l]=1;
				cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].l<<endl;
			}
			else {
				for(int j=a[i].l;j<=a[i].r;j++){
					if(vis[j]==0){
						vis[j]=1;
						cout<<a[i].l<<" "<<a[i].r<<" "<<j<<endl;
						break;
					}
				}
			}
		}
        cout<<endl;
	}
	return 0;
}

[ABC225F] String Cards - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

扩展:

C++ fill()函数最详细介绍-CSDN博客

D - Bouquet (atcoder.jp)

Bouquet

这道题就是一道排列组合的问题;

每次遇到模就给我整不会了;

这道题很简单,就是有n朵花,给你两个数a,b,要求花数不能为a b,那么就是一个简单的组合问题;总的方案数就是n朵里面选1朵,或者选两朵。。。。选n朵,所以不排除a和b的那两种方案数就Cn1+Cn2+Cn3+.....Cnn=2的n次方-Cn0=2^n-1;

然后我们在针对不排除a和b的方案数中减去Cna和Cnb的排列组合;

就是这个模数这里,需要用到卢卡斯定理卢卡斯定理 - OI Wiki (oi-wiki.org)

Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数。正常的组合数运算可以通过递推公式求解(详见 排列组合),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理。

记住模版就好

long long Lucas(long long n, long long m, long long p) {
  if (m == 0) return 1;
  return (C(n % p, m % p, p) * Lucas(n / p, m / p, p)) % p;
}

这里算组合数有很多种方法,详细见:【数论】求组合数的四种方法_c++求组合数-CSDN博客

这里用到的是时间复杂度为NlogN的预处理法;

先预处理出范围内所有数的阶乘和阶乘逆元,根据第一个公式直接取需要的阶乘和阶乘逆元的值即可。

1.什么是逆元:就是数论里的倒数乘法逆元通俗易懂的理解方法-CSDN博客

取模运算不满足除法的分配率;

即(a/b)%p != (a%p/b%p)%p;

此时就需要乘法的逆元

 举个例子

2 x 3 ≡ 1 (mod 5 ) 即 2 x 3 对 5 取模和 1 对 5 取模是同余的 都是1 。 其中 3就是 2的乘法逆元。
实战:
在这里插入图片描述

乘法的逆元就是将一个除法写成了乘法。

求逆元的几种方式:【数论】求逆元的四种方法-CSDN博客

2.这里求逆元的阶乘用到了费马小定理;

,x是a的最小逆元

定理内容:如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)

变换一下可得

所以求组合数的代码就是

int C(int a, int b){    // 求组合数C(a, b)
	int res=1;
	for(int i=1,j=a;i<=b;i++,j--){
		res=res*j%mod;
		res=res*km(i,mod-2,mod)%mod;
	}
	return res;
}

然后再套一个快速幂的模版:

int km(int a, int n, int m)
{
	int ans = 1;
	while(n){
		if(n&1){
			ans = (ans * a) % m;
		}
		a = (a * a) % m;
		n >>= 1;
	}
	return ans;
}

最后AC:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b;
const int mod=1000000007;
int km(int a, int n, int m)
{
	int ans = 1;
	while(n){
		if(n&1){
			ans = (ans * a) % m;
		}
		a = (a * a) % m;
		n >>= 1;
	}
	return ans;
}
int C(int a, int b){    // 求组合数C(a, b)
	int res=1;
	for(int i=1,j=a;i<=b;i++,j--){
		res=res*j%mod;
		res=res*km(i,mod-2,mod)%mod;
	}
	return res;
}
int lucas(int a, int b)
{
	if (a < mod && b < mod) return C(a, b);
	return (int)C(a % mod, b % mod)* lucas(a /mod, b /mod) %mod;
}
signed main(){
	int n;
	cin>>n;
	cin>>a>>b;
	int ans=km(2,n,mod);
	ans-=1;
	ans-=lucas(n,a)%mod+lucas(n,b)%mod;
	cout<<(ans+mod)%mod<<endl;
	return 0;
}

String Cards

[ABC225F] String Cards - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题的第一感觉就是对字符串进行排序然后直接拼接;

但是举一个例子,比如:

b ba这两个字符的最小字典树拼接法就是bab

但是按照排序后拼接就是bba;因为b的字典序比ba小

所以这么做显然是存在问题的;

这里需要用到动态数组

在 n 个字符串中选取 k 个任意连接,得到字典序最小的字符串。
按照 A+B > B+A 的顺序排序。
设 dpi,j表示前 i 个字符串取 j 个得到的最小字符。

dpi+1,j = dpi,j
dpi+1,j=min(dpi+1,j,s+dpi,j−1),s 表 示 可 选 择 的 字 符 串 

#include<bits/stdc++.h>
using namespace std;
string s[100], dp[55];
bool cmp(string a, string b){
	return a+b > b+a;
}
int main() {	
	int n, k;
	cin >> n >> k;
	for(int i = 1; i <= n; i++) cin >> s[i];
	sort(s+1, s+n+1, cmp);
	for(int i = 1; i <= n; i++) dp[i] = "{";
	dp[0] = "";
	for(int i = 1; i <= n; i++){
		for(int j = k-1; j >= 0; j--){
			dp[j+1] = min(dp[j+1], s[i] + dp[j]);
		}
	}
	cout << dp[k] << endl;
	return 0;
}

 Make Equal With Mod

Problem - B - Codeforces

这道题有三种情况可以输出YES;

第一种是全为1,;

第二种是1没有出现过一次;

第三种是有1存在,那么我们就需要把非1的数除余非1数-1,使他除余后为1;

但是如果存在连续的两个数,除余后必有一个为0,所以就不能输出YES;

所以当有1存在的时候需要保证时候有连续的两个数出现;

#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[200005];
signed main(){
		int t;
		cin>>t;
		while(t--){
			//set<int>a;
		int f=0;
		int p=0;
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			int x;
			cin>>b[i];
			x=b[i];
			if(x==1){
				f++;
			}
		}
		sort(b+1,b+1+n);
		for(int i=2;i<=n;i++){
			if(b[i]-b[i-1]==1){
				p=1;
				break;
			}
		}
		if(f==n||f==0||p==0)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
		}
	return 0;
}

Buy an Integer

[ABC146C] Buy an Integer - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解释一下这里的d(N)是什么意思,是十进制下N有几位,

二分求出答案即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,k;
bool check(int x){
	int sum=0;
	int num=x;
	while(num){
		num/=10;
		sum++;
	}
	if(a*x+b*sum<=k)return 1;
	else return 0;
}
signed main(){

	cin>>a>>b>>k;
	int l=1,r=1e9;
	while(l<r){
		int mid=(l+r+1)/2;
		if(check(mid)){
			l=mid;
		}
		else r=mid-1;
	}
	
	if(check(l))cout<<l<<endl;
	else cout<<0<<endl;
	
}

String Formation

[ABC158D] String Formation - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题唯一的难点就是翻转那里超时,其实不用真的翻转如果翻转次数为计数,只用把放前面的操作放后面,放后面的操作放前面就可以了。每次翻转都累加翻转次数就能出答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
string s;
deque<char>ans;
signed main(){
cin>>s;
int q;
for(int i=0;i<s.size();i++){
	ans.push_back(s[i]);
}
cin>>q;
int fan=0;
while(q--){
	int op;
	cin>>op;
	if(op==1){
		fan++;
	}
	else {
		int n;
		char x;
		cin>>n;
		cin>>x;
	//	cout<<fan<<endl;
		if(n==1){
			if(fan%2!=0){
				ans.push_back(x);
			}
			else ans.push_front(x);
		}
		else {
			if(fan%2!=0){
				ans.push_front(x);
			}
			else ans.push_back(x);
		}
	}
}
if(fan%2!=0)reverse(ans.begin(),ans.end());
for(auto p:ans){
	cout<<p;
}
	return 0;
}

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

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

相关文章

数模打怪(八)之图论模型

一、作图 图的数学语言描述&#xff1a; G( V(G), E(G) )&#xff0c;G&#xff08;graph&#xff09;&#xff1a;图&#xff0c;V&#xff08;vertex&#xff09;&#xff1a;顶点集&#xff0c;E&#xff08;edge&#xff09;&#xff1a;边集 1、在线作图 https://csac…

第G4周:CGAN|生成手势图像 | 可控制生成

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊 理论知识&#xff1a; 条件生成对抗网络&#xff08;CGAN&#xff09;是在生成对抗网络&#xff08;GAN&#xff09;的基础上进行了一些改进。对于原始GAN的生成器而言&#xff0c;其生成的…

C#基础——类、构造函数和静态成员

类 类是一个数据类型的蓝图。构成类的方法和变量称为类的成员&#xff0c;对象是类的实例。类的定义规定了类的对象由什么组成及在这个对象上可执行什么操作。 class 类名 { (访问属性) 成员变量; (访问属性) 成员函数; } 访问属性&#xff1a;public&#xff08;公有的&…

MinIO对象生命周期

Object Management — MinIO Object Storage for Windowshttps://min.io/docs/minio/windows/administration/object-management.html 1.概念 MinIO 对象生命周期是指对存储在 MinIO 中的对象进行自动管理的一套策略。这些策略可以用于自动删除旧对象、转移对象到不同的存储类别…

Golang高效合并(拼接)多个gzip压缩文件

有时我们可能会遇到需要把多个 gzip 文件合并成单个 gzip 文件的场景&#xff0c;最简单最容易的方式是把每个gzip文件都先解压&#xff0c;然后合并成一个文件后再次进行压缩&#xff0c;最终得到我们想要的结果&#xff0c;但这种先解压后压缩的方式显然效率不高&#xff0c;…

day08:订单状态定时处理、来单提醒和客户催单

文章目录 Spring Task介绍cron表达式入门案例 订单状态定时处理需求分析代码开发扩展 WebSocket介绍入门案例特点 来单提醒需求分析和设计代码实现 客户催单需求分析和设计代码实现 Spring Task 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时…

爬虫提速!用Python实现多线程下载器!

✨ 内容&#xff1a; 在网络应用中&#xff0c;下载速度往往是用户体验的关键。多线程下载可以显著提升下载速度&#xff0c;通过将一个文件分成多个部分并行下载&#xff0c;可以更高效地利用带宽资源。今天&#xff0c;我们将通过一个实际案例&#xff0c;学习如何用Python实…

C++ | Leetcode C++题解之第292题Nim游戏

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canWinNim(int n) {return n % 4 ! 0;} };

如何使用API快速打造健康医疗系统?

在数字医疗市场&#xff0c;数据是人们经常谈及的一个话题。当前&#xff0c;消费者医疗和健康应用收集的数据越来越多&#xff0c;电子健康记录的实施也创造出了大量有关病人的电子信息。 API接口在智慧医院跨网、跨机构之间的业务协同和数据共享交换中得到数据共享。支撑了医…

鸿蒙APP架构及开发入门

1.鸿蒙系统 1.1 什么是鸿蒙 鸿蒙是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、…

【数学建模】权重生成与评价模型(上)

文章目录 权重生成与评价模型&#xff08;上&#xff09;1. 层次分析法1.1 层次分析法的原理构建判断矩阵权重向量计算一致性检验 1.2 层次分析法的案例1. 建立层次结构2. 构建判断矩阵3. 计算权重向量4. 一致性检验5. 计算综合权重 1.3 另一种得出综合得分的方法例子计算步骤完…

计算机实验室排课查询小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#xff0c;取消预约管理&#xff0c;实验课程管理&#xff0c;实验报告管理&#xff0c;报修信息管理&#xff0…

Leetcode49. 字母异位词分组(java实现)

今天我来给大家分享的是leetcode49的解题思路&#xff0c;题目描述如下 如果没有做过leetcode242题目的同学&#xff0c;可以先把它做了&#xff0c;会更好理解异位词的概念。 本道题的大题思路是&#xff1a; 首先遍历strs&#xff0c;然后统计每一个数组元素出现的次数&#…

Java 基础学习第二节: Java 变量与数据类型

第二节 001.回顾 1.Java开发环境 1.Java编译运行过程 编译期:.java源文件,经过编译,生成.class字节码文件运行期:JVM加载.class文件并运行跨平台,一次编程,到处使用 2.名词解释 JVM:java虚拟机,加载并运行.classJRE:java运行环境,JVMjava系统类库JDK:java开发工具包,JRE开发j…

【计算机网络】期末实验答辩

注意事项&#xff1a; 1&#xff09;每位同学要在下面做过的实验列表中选取三个实验进行答辩准备&#xff0c;并将自己的姓名&#xff0c;学号以及三个实验序号填入共享文档"1&#xff08;2&#xff09;班答辩名单"中。 2&#xff09;在答辩当日每位同学由老师在表…

Dify 零代码 AI 应用开发:快速入门与实战

一、Dify 介绍 Dify 是一个开源的大语言模型 (LLM) 应用开发平台。它结合了后端即服务 (Backend-as-a-Service) 和 LLMOps (LLMOps) 的概念&#xff0c;使开发人员能够快速构建生产级生成式 AI (Generative AI) 应用。即使是非技术人员也可以参与 AI 应用的定义和数据操作。 …

CeoMax总裁主题最新3.8.1破解免授权版/WordPress付费资源素材下载主题

CeoMax总裁主题最新3.8.1破解免授权版&#xff0c;一套WordPress付费资源素材下载的主题&#xff0c;感觉这是做资源站唯一一个可以和ripro媲美甚至超越的模板&#xff0c;UI很美&#xff0c;功能也很强大&#xff0c;有想学习的可下载搭建学习一下&#xff0c;仅供学习研究借鉴…

C语言同时在一行声明指针和整型变量

如果这么写&#xff0c; int *f, g; 并没有声明2个指针&#xff0c;编译器自己会识别&#xff0c;f是一个指针&#xff0c;g是一个整型变量&#xff1b; void CTszbView::OnDraw(CDC* pDC) {CTszbDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for nat…

11. Hibernate 持久化对象的各种状态

1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程&#xff0c;你将了解到&#xff1a; 持久化对象的 3 种状态&#xff1b;什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中…

ElasticSearch核心之DSL查询语句实战

什么是DSL&#xff1f; Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的&#xff0c;所以你必…