蓝桥杯[错误的票据]
题目:
某涉密单位下发了某种票据,并要在年终全部收回每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个 ID断号,另外一个ID 重号。你的任务是通过编程,找出断号的ID和重号的ID假设断号不可能发生在最大和最小号
输入描述:
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于10^5)
输出描述:
要求程序输出1行,含两个整数 m,n,用空格分隔。
其中,m 表示断号ID,n 表示重号ID
输入输出样例示:
输入#
2 5 6 8 11 9 10 12 9
输出#
7 9
解法一:C++的解法 #
#include<bits/stdc++.h>
using namespace std;
int main()
{vector<int> arr; //开辟动态数组int N; //设置变量N表示后面数据函数cin >> N;for (int i = 0; i < N; i++){int k = 0;while (cin >> k){arr.push_back(k); //vector的尾插if (cin.get() == '\n') //当接受到回车键时,就退出当前循环{break;}}}sort(arr.begin(), arr.end()); //快速排序int m, n;for (int i = 0; i < arr.size(); i++){if ((arr[i + 1] - arr[i]) > 1) //如果前后两个数据>1则出现断号{m = arr[i + 1] - 1; }if(arr[i+1] == arr[i]){n = arr[i];}}cout << m << " " << n;return 0;
}
解法二:C的解法#
#include<stdio.h>
#include<stdlib.h>
int main()
{int N, arr[20000] = { 0 }, m, n, i = 0;scanf("%d", &N);while (N--){while (scanf("%d", &arr[i])>0){i++;if(getchar() == '\n'){break;}}}int PaiXu(const void* p1, const void* p2){return (*(int*)p1 - *(int*)p2);}int rs = sizeof(arr) / sizeof(arr[0]);qsort(arr,rs, sizeof(int), PaiXu);//快速排序for (int i = 1; i < rs; i++){if((arr[i]-arr[i-1])>1){m = arr[i]-1;}else if((arr[i]-arr[i-1]) == 0){n = arr[i];}}printf("%d %d", m, n);return 0;
}
蓝桥杯[X图形]
题目:
给定一个字母矩阵。一个X图形由中心点和由中心点向四个 45 度斜线方向引出的直线段组成,四条线段的长度相同,而且四条线段上的字母和中心点的字母相同。
一个X图形可以使用三个整数 r,c,L来描述,其中 r,c 表示中心点位于第r行第c列,正整数L表示引出的直线段的长度。对于1到L之间的每个整数i,X图形满足:第 r-i 行第 c-i 列与第r行第c列相同,第 r-i 行第 c+i 列与第r行第c列相同,第 r+i 行第 c-i 列与第r行第c列相同,第 r+i 行第 c+i 列与第r 行第c列相同。
例如:对于下面的字母矩阵中,所有的字母组成一个X图形,中间的5个L也组成一个X图形。所有字母Q组成了一个X图形。
给定一个字母矩阵,请求其中有多少个X图形 ?
输入格式:
输入第一行包含两个整数n,m,分别表示字母矩阵的行数和列数。
接下来n行,每行m个大写字母,为给定的矩阵。
输出格式:
输出一行,包含一个整数,表示答案。
样例输入#
5 6 LAAALA ALQLQA AALQAA ALQLQA LAAALA
样例输出#
3
#include<bits/stdc++.h>
using namespace std;
int main()
{int n = 0,m = 0,count = 0;cin>>n>>m;char arr[101][101] = {0};for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){cin>>arr[i][j];}}for(int i = 1;i<n-1;i++){for(int j = 1;j<m-1;j++){char k = arr[i][j];int l = 1;while((k == arr[i-l][j-l])&&(k == arr[i-l][j+l])&&(k == arr[i+l][j-l])&&(k == arr[i+l][j+l])){count++;l++;}}}cout<<count;return 0;
}
蓝桥杯[核桃的数量]
题目:
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1各组的核桃数量必须相同
2.各组内必须能平分核桃(当然是不能打碎的)
3尽量提供满足12条件的最小数量(节约闹革命嘛)
输入描述:
输入一行a,b,c,都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c < 30)。
输出描述:
输出一个正整数,表示每袋核桃的数量。
输入输出样例
输入#
2 4 5
输出#
20
解法一:C++的解法#
#include<bits/stdc++.h>
using namespace std;
int main()
{int a[3] = { 0 },num = 0;for (int i = 1; i <= 3; i++){cin >> a[i];}int max = *max_element(a, a + 3);//求出三组中的最大值for (int i = 1;; i++) //因为我们也不知道要进行多少次,所以不设置循环条件{num = max * i; //求最大组的倍数//判断是否满足平分的条件if ((num % a[1] == 0) && (num % a[2] == 0) && (num % a[3] == 0)) {break;}}cout << num;return 0;
}
解法二:C的解法#
#include <stdio.h>
int main()
{int a[3] = { 0 },num = 0,max = 0;for (int i = 1; i <= 3; i++){scanf("%d",&a[i]);if(a[i]>max){max = a[i];}}for (int i = 1;; i++) {num = max * i; if ((num % a[1] == 0) && (num % a[2] == 0) && (num % a[3] == 0)) {break;}}printf("%d",num);return 0;
}
蓝桥杯[最大距离]
题目描述:
在数列a1,a2,···,an中,定义两个元素ai和aj的距离为| i - j |+| ai - aj |,即元素下标的距离加上元素值的差的绝对值,其中| x |表示x的绝对值。
给定一个数列,请问找出元素之间最大的元素距离。
输入描述:
输入的第一行包含一个整数n。
第二行包含n个整数a1,a2,···,an,相邻的整数间用空格分隔,表示给定的数列。
其中,2<=n<=1000,0<=数列中的数 <=10^4。
输出描述:
输出一行包含一个整数,表示答案
输入输出样例:
输入#
5 9 4 2 4 7
输出#
9
#include<bits/stdc++.h>
using namespace std;
int main()
{int n,str[1000] = {0},max = 0;cin>>n;for(int i = 1;i<=n;i++){cin>>str[i];}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(abs(i-j)+abs(str[i]-str[j])>max) //abs绝对值的函数max=abs(i-j)+abs(str[i]-str[j]);}}cout<<max;return 0;
}
蓝桥杯[特殊年份]
问题描述:
今年是2021年,2021这个数字非常特殊它的千位和十位相等,个位比百位大1,我们称满足这样条件的年份为特殊年份。
输入5个年份请计算这里面有多少个特殊年份。
输入格式:
输入 5 行,每行一个4位十进制数(数值范围为1000至9999),表示一个年份。
输出格式:
输出一个整数表示输入的5个年份中有多少个特殊年份。
样例输入#
20192021192021209899
样例输出#
2
样例说明:
2021 和 9899 是特殊年份,其它不是特殊年份。
解法一:C++的解法#
#include<bits/stdc++.h>
using namespace std;
int main()
{vector<int> str;int count = 0;for(int i = 0;i<5;i++){int b = 0;cin>>b;str.push_back(b);}for(int i = 0;i<5;i++){int g=str[i]%10;int s=str[i]/10%10;int b=str[i]/100%10;int q=str[i]/1000;if((g == b+1)&&(q == s)){count++;}}cout<<count;return 0;
}
解法二:C的解法#
#include <stdio.h>
int main()
{int str[5] = {0};int count = 0;for(int i = 0;i<5;i++){scanf("%d",&str[i]);}for(int i = 0;i<5;i++){int g=str[i]%10;int s=str[i]/10%10;int b=str[i]/100%10;int q=str[i]/1000;if((g == b+1)&&(q == s)){count++;}}printf("%d",count);return 0;
}