目录
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;
}