蓝桥杯算法训练合集十二 1.比较2.计算最小公倍数3.比赛安排4.潜伏者5.P0702

目录

1.比较

2.计算最小公倍数

3.比赛安排

4.潜伏者

5.P0702


1.比较

问题描述

给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2],
询问数列第L2到R2个数字每一个数在数列第L1到R1个数中有多少个数字不大于它。

输入格式

第一行两个整数n,m
第二行n个整数,表示数列。
接下来m行,每行四个整数L1,R1,L2,R2,意义如上

输出格式

m行,每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数,第一个整数表示第L2+1个数在数列第L1到R1个数中不大于它的个数,以此类推

样例输入

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

样例输出

1 1
2 1 2 2 0
2 3

数据规模和约定

n,m<=1000,数列的数字非负且小于1000。

示例代码

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
	int n, m, l1, r1, l2, r2, a[1000];
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < m; i++) {
		cin >> l1 >> r1 >> l2 >> r2;
		int b[1000], c[1000], d[1000], len1, len2;
		len1 = r1 - l1 + 1;
		len2 = r2 - l2 + 1;
		for (int j = 0; j < len1; j++) {//找到l1,r1之间的所有数,放到数组b里
			b[j] = a[l1 - 1 + j];
			//cout << b[j] << " ";
		}
		// cout << endl;
		for (int j = 0; j < len2; j++) {//找到l2,r2之间的所有数,放到数组c里
			c[j] = a[l2 - 1 + j];
			//cout << c[j] << " ";
		}
		//cout << endl;
		sort(b, b + len1);//b,c从小到大排序
		sort(c, c + len2);
		int index = 0;
		for (int j = 0; j < len2; j++) {//对数组c里的数挨个遍历
			while (c[j] >= b[index]) {//当找到大于等于c[j]的数,退出循环
				if (index == len1) {//如果c[j]大于b中所有数
					break;
				}
				index++;//比较下一个b中的数
			}
			d[c[j]] = index;//d[m]=n表示数字m的答案是n
		}
		for (int j = 0; j < len2; j++) {
			cout << d[a[l2 - 1 + j]] << " ";
		}
		cout << endl;
	}
	return 0;
}

2.计算最小公倍数

问题描述

接收用户输入的自然数m,n,计算它们的最小公倍数。

样例输入

4 6

样例输出

12

分析

最小公倍数 * 最大公约数=两个数的乘积

示例代码

#include<iostream>
using namespace std;
int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

int main() {
	int a, b;
	cin >> a >> b;
	int c = a * b / gcd(a, b);
	cout << c;
	return 0;
}

3.比赛安排

问题描述

设有2^n (n≤6)个球队进行单循环比赛,计划在2^n−1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2^n−1天内每个队都与不同的对手比赛。

输入格式

输入共一行,输入n的数值。

输出格式

输出共2^n−1行,第i行输出第i天的比赛安排。
格式为:<i>A-B C-D ……。其中i是天数,A,B分别为比赛双方的编号,每行共2^n−1个比赛场次。

样例输入

2

样例输出

<1>1-2 3-4
<2>1-3 2-4
<3>1-4 2-3

数据规模和约定

1<=n<=4

示例代码

#include<iostream>
using namespace std;
int flag[64][64], day[64];

int main() {
	int n, temp = 1;
	cin >> n;
	for (int i = 0; i < n; i++) {
		temp *= 2;
	}
	for (int k = 1; k < temp; k++) {//天数
		cout << "<" << k << ">";
		for (int i = 0; i < temp; i++) {
			if (day[i] == 0) {//如果该球队当天还没打比赛
				for (int j = 0; j < temp; j++) {
					if (flag[i][j] == 0 && i != j && day[j] == 0) {//如果i队伍和j没打过比赛
						day[i] = 1;
						day[j] = 1;
						flag[i][j] = 1;
						cout << i + 1 << "-" << j + 1 << " ";
						break;
					}
				}
			}
		}
		cout << endl;
		for (int i = 0; i < temp; i++) {
			day[i] = 0;
		}
	}
	return 0;
}

4.潜伏者

问题描述

R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。
历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则:
1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所得的内容均由大写字母‘A’-‘Z’构成(无空格等其他字符)。
2. S 国对于每个字母规定了对应的“密字”。加密的过程就是将原信息中的所有字母替换为其对应的“密字”。
3. 每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。“密字”可以和原字母相同。
例如,若规定‘A’的密字为‘A’,‘B’的密字为‘C’(其他字母及密字略),则原信息“ABA”被加密为“ACA”。
现在,小 C 通过内线掌握了 S 国网络上发送的一条加密信息及其对应的原信息。小 C希望能通过这条信息,破译 S 国的军用密码。小 C 的破译过程是这样的:扫描原信息,对于原信息中的字母 x(代表任一大写字母),找到其在加密信息中的对应大写字母 y,并认为在密码里 y 是 x 的密字。如此进行下去直到停止于如下的某个状态:
1. 所有信息扫描完毕,‘A’-‘Z’ 所有 26 个字母在原信息中均出现过并获得了相应的“密字”。
2. 所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。
3. 扫描中发现掌握的信息里有明显的自相矛盾或错误(违反 S 国密码的编码规则)。例如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。
在小 C 忙得头昏脑涨之际,R 国司令部又发来电报,要求他翻译另外一条从 S 国刚刚截取到的加密信息。现在请你帮助小 C:通过内线掌握的信息,尝试破译密码。然后利用破译的密码,翻译电报中的加密信息。

输入格式

输入文件名共 3 行,每行为一个长度在 1 到 100 之间的字符串。
第 1 行为小 C 掌握的一条加密信息。
第 2 行为第 1 行的加密信息所对应的原信息。
第 3 行为 R 国司令部要求小 C 翻译的加密信息。
输入数据保证所有字符串仅由大写字母‘A’-‘Z’构成,且第 1 行长度与第 2 行相等。

输出格式

输出文件共 1 行。
若破译密码停止时出现 2,3 两种情况,请你输出“Failed”(不含引号,注意首字母大写,其它小写)。
否则请输出利用密码翻译电报中加密信息后得到的原信息。

输入样例1

AA
AB
EOWIE

输出样例1

Failed

输入输出样例1说明

原信息中的字母‘A’和‘B’对应相同的密字,输出“Failed”。

输入样例2

QWERTYUIOPLKJHGFDSAZXCVBN
ABCDEFGHIJKLMNOPQRSTUVWXY
DSLIEWO

输出样例2

Failed

输入输出样例2说明

字母‘Z’在原信息中没有出现,输出“Failed”。

输入样例3

MSRTZCJKPFLQYVAWBINXUEDGHOOILSMIJFRCOPPQCEUNYDUMPP
YIZSDWAHLNOVFUCERKJXQMGTBPPKOIYKANZWPLLVWMQJFGQYLL
FLSO

输出样例3

NOIP

示例代码

#include<iostream>
using namespace std;


int main() {
	string str1, str2, str3, str4, mima = "aaaaaaaaaaaaaaaaaaaaaaaaaa";
	int flag[26] = { 0 };
	cin >> str1 >> str2 >> str3;
	int len1 = str1.length();
	int len2 = str3.length();
	for (int i = 0; i < len1; i++) {
		if (mima[int(str1[i]) - 65] == 'a') {//如果该字符没有被配对过
			if (flag[str2[i]] == 1) {//如果是第三种情况
				cout << "Failed";
				return 0;
			}
			mima[int(str1[i]) - 65] = str2[i];
			flag[str2[i]] = 1;
		}
		else {
			if ((mima[int(str1[i]) - 65] != str2[i]) ) {//如果是第三种情况
				//cout << int(str1[i]) - 65<<"SSSSS"<<mima[int(str1[i]) - 65] << " " << str2[i] << endl;
				//cout << "第三种情况" << endl;
				cout << "Failed";
				return 0;
			}
		}
	}
	for (int i = 0; i < 26; i++) {
		if (mima[i] == 'a') {//如果是第二种情况
			//cout << "第二种情况" << endl;
			cout << "Failed";
			return 0;
		}
	}
	for (int i = 0; i < len2; i++) {
		cout << mima[int(str3[i] - 65)];
	 }
	return 0;
}

5.P0702

问题描述

在C语言中,有一个strcmp函数,其功能是比较两个字符串s1和s2。请编写一个你自己的字符串比较函数my_strcmp,来实现strcmp函数的类似功能。如果s1=s2,则返回0;否则返回s1 与s2 第一个不同字符的差值(如果s1<s2,该差值是一个负数;如果s1>s2,该差值是一个正数)。编写测试程序,输入两个长度小于1000的字符串(可能包含有空格,且长度不一定相等),然后调用my_strcmp函数来进行比较,并输出返回结果。

样例输入

aBcDefgf
aacdef

样例输出

-31

示例代码

#include<iostream>
#include<string.h>
using namespace std;

int my_strcmp(char s1[1000],char s2[1000]) {
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	if (len1 < len2) {
		for (int i = 0; i < len1; i++) {
			if (s1[i] != s2[i]) {
				return int(s1[i]) - int(s2[i]);
			}
		}
		return -115;
	}
	else if(len1>len2){
		for (int i = 0; i < len2; i++) {
			if (s1[i] != s2[i]) {
				return int(s1[i]) - int(s2[i]);
			}
		}
		return 115;
	}
	else {
		for (int i = 0; i < len2; i++) {
			if (s1[i] != s2[i]) {
				return int(s1[i]) - int(s2[i]);
			}
		}
	}
	return 0;
}
int main() {
	char s1[1000], s2[1000];
	gets(s1);
	gets(s2);
	cout << my_strcmp(s1, s2);
	return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值