当前位置: 首页 > news >正文

3月28号

今天写了一些算法题:

P1866 编号

题目描述

太郎有 N 只兔子,现在为了方便识别它们,太郎要给他们编号。兔子们向太郎表达了它们对号码的喜好,每个兔子 i 想要一个整数,介于 1 和 Mi​ 之间(可以为 1 或 Mi​)。当然,每个兔子的编号是不同的。现在太郎想知道一共有多少种编号的方法。

你只用输出答案对 109+7 取余的结果即可。如果这是不可能的,就输出 0。

输入格式

第一行是一个整数 N。

第二行 N 个整数 Mi​。

输出格式

一个整数,表示方案总数。

输入输出样例

输入 #1复制

2
5 8

输出 #1复制

35

说明/提示

数据范围及约定

对于全部数据,1≤N≤50,1≤Mi​≤1000。

#include<bits/stdc++.h>
using namespace std;
long long n,sum=1,a[55];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	for(int i=0;i<n;i++){
		sum=sum*(a[i]-i);
		sum=sum%1000000007;
	}
	cout<<sum;
	return 0;
}

P1892 [BalticOI 2003] 团伙

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q,sum=0,f[1005],a[1005],b[1005];
char c;
int find(int x){
	while(f[x]!=x)x=f[x];
	return x;
}
void add(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y)return;
	f[y]=x;
	return;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>c>>p>>q;
		if(c=='F')add(p,q);
		else{
			if(a[p]==0)a[p]=find(q);
			else add(q,a[p]);
			if(a[q]==0)a[q]=find(p);
			else add(p,a[q]);
		}
	}
	for(int i=1;i<=n;i++){
		b[find(i)]++;
	}
	for(int i=1;i<=n;i++){
		if(b[i])sum++;
	}
	cout<<sum;
	return 0;
}

P1044 [NOIP 2003 普及组] 栈

题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 n。

现在可以进行两种操作,

  1. 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)
  2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。

(原始状态如上图所示)

你的程序将对给定的 n,计算并输出由操作数序列 1,2,…,n 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 n(1≤n≤18)。

输出格式

输出文件只有一行,即可能输出序列的总数目。

输入输出样例

输入 #1复制

3

输出 #1复制

5

说明/提示

【题目来源】

NOIP 2003 普及组第三题

#include<bits/stdc++.h>
using namespace std;
long long n,a[1000];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	a[1]=1;
	for(int i=2;i<=18;i++){
		a[i]=a[i-1]*2*(2*i-1)/(i+1);
	}
	cout<<a[n];
	return 0;
}

P1469 找筷子

题目描述

经过一段时间的紧张筹备,电脑小组的“RP 餐厅”终于开业了,这天,经理 LXC 接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题:筷子!

CX 小朋友找出了餐厅中所有的筷子,但遗憾的是这些筷子长短不一,而我们都知道筷子需要长度一样的才能组成一双,更麻烦的是 CX 找出来的这些筷子数量为奇数,但是巧合的是,这些筷子中只有一只筷子是落单的,其余都成双,善良的你,可以帮 CX 找出这只落单的筷子的长度吗?

输入格式

第一行是一个整数,表示筷子的数量 n。

第二行有 n 个整数,第 i 个整数表示第 i 根筷子的长度 ai​。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1复制

9
2 2 1 3 3 3 2 3 1

输出 #1复制

2

说明/提示

数据规模与约定
  • 对于 30% 的数据,保证 n≤105。
  • 对于 100% 的数据,保证 1≤n≤107+1,1≤ai​≤109。
提示
  • 请注意数据读入对程序效率造成的影响。
  • 请注意本题的空间限制为 4 Mb。
#include<bits/stdc++.h>
using namespace std;
int ans,n,a;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
	cin>>n;
	for (int i=1;i<=n;i++)
	{
   	  	cin>>a;
		ans^=a;
	}
	printf("%d",ans);
	return 0;
}

P2437 蜜蜂路线

题目背景

题目描述

一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m 开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n−1)

输入格式

输入 m,n 的值

输出格式

爬行有多少种路线

输入输出样例

输入 #1复制

1 14

输出 #1复制

377

说明/提示

对于100%的数据,1≤M,N≤1000

#include<bits/stdc++.h>
using namespace std;
int n,m,len=1,a[5005]={1},b[5005]={1},c[5005]={1};
void f(){
	int jw=0;
	for(int i=0;i<len;i++){
		c[i]=a[i]+b[i]+jw;
		jw=c[i]/10;
		c[i]=c[i]%10;
	}
	if(jw!=0){
		c[len]=jw;
		len++;
	}
	for(int i=0;i<len;i++){
		a[i]=b[i];
		b[i]=c[i];
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n>>m;
	for(int i=3;i<=m-n+1;i++){
		f();
	}
	for(int i=len-1;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}

P1255 数楼梯

题目描述

楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入 #1复制

4

输出 #1复制

5

说明/提示

  • 对于 60% 的数据,N≤50;
  • 对于 100% 的数据,1≤N≤5000。
#include<bits/stdc++.h>
using namespace std;
int n,len=1,a[5005]={1},b[5005]={1},c[5005]={1};
void f(){
	int jw=0;
	for(int i=0;i<len;i++){
		c[i]=a[i]+b[i]+jw;
		jw=c[i]/10;
		c[i]=c[i]%10;
	}
	if(jw!=0){
		c[len]=jw;
		len++;
	}
	for(int i=0;i<len;i++){
		a[i]=b[i];
		b[i]=c[i];
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	for(int i=2;i<=n;i++)f();
	for(int i=len-1;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}

 

相关文章:

  • Redis:Hash 类型 内部实现、命令及应用场景
  • 51c嵌入式~MOS~合集1
  • 计算机网络基础:网络流量工程与优化策略
  • Three.js 快速入门教程【二十】3D模型加载优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
  • Kafka 偏移量
  • python-59-基于python内置库解析html获取标签关键信息
  • python项目整体文件和依赖打包
  • ​Flink/Kafka在python中的用处
  • 局域网共享失败?打印机/文件夹共享工具
  • 机器学习中的数学知识
  • 【 C 语言实现顺序表的基本操作】(数据结构)
  • 使用matlab进行分位数回归
  • 三数之和
  • B494:开关电源领域的PWM控制新星
  • [特殊字符] AI 编程工具推荐与场景指南 ——提升研发效率的智能助
  • 练习题:109
  • 【机密计算顶会解读】12:机密提示——保护云LLM推理服务中的用户提示词
  • vue将页面导出成word
  • LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析
  • NO.59十六届蓝桥杯备战|基础算法-前缀和|一维前缀和|最大子段和|二维前缀和|激光炸弹(C++)
  • 绿景中国地产:洛杉矶酒店出售事项未能及时披露纯属疏忽,已采取补救措施
  • 财政部党组召开2025年巡视工作会议暨第一轮巡视动员部署会
  • 古巴外长谴责美国再次将古列为“反恐行动不合作国家”
  • 当我们提起拉动消费时,应该拉动什么消费?
  • 印度证实印巴已同意停火
  • 稳住外贸基本盘,这个中部大省出手了