蓝桥杯算法训练习题与官方答案

合集下载

蓝桥杯算法提高训练之贪心-线段和点

蓝桥杯算法提高训练之贪心-线段和点

问题描述有n个点和m个区间,点和区间的端点全部是整数,对于点a和区间[b,c],若a>=b且a<=c,称点a满足区间[b,c]。

求最小的点的子集,使得所有区间都被满足。

输入格式第一行两个整数n m以下n行每行一个整数,代表点的坐标以下m行每行两个整数,代表区间的范围输出格式输出一行,最少的满足所有区间的点数,如无解输出-1。

样例输入5 5263872 53 43 32 76 9样例输出2数据规模和约定1<=n,m<=100000<=点和区间的坐标<=50000参考代码见下页# include <stdio.h># include <string.h># include <algorithm>using namespace std;int vis[10010];struct segment{int begin;int end;};struct node{int cur;int num;};struct node s1[50010];struct segment s2[10010];int compare2(struct segment a, struct segment b){if(a.begin!=b.begin){return a.begin<b.begin;}return a.end<b.end;}int main(){int n, m;int num, count=0;int i, j, k;scanf("%d%d", &n, &m);for(i=0; i<=50009; i++){s1[i].cur=0;}for(i=1; i<=n; i++){scanf("%d", &num);s1[num].cur = 1;}for(i = 1; i <= m; i++){scanf("%d%d", &s2[i].begin, &s2[i].end);}memset(vis, 0, sizeof(vis));sort(s2 + 1, s2 + 1 + m, compare2);int max, cur;for(i=1; i<=m; i++){max=-1;if(!vis[i]){for(j = s2[i].begin; j <= s2[i].end; j++){if(s1[j].cur){s1[j].num=0;for(k = i+1; k <= m; k++){if(s2[k].begin<=j&&s2[k].end>=j&&!vis[k]){s1[j].num++;}else{break;}}if(s1[j].num>max){max=s1[j].num;cur=j;}}}count++;for(k = i+1; k <= m; k++){if(s2[k].begin<=cur){vis[k]=1;}else{break;}}}}printf("%d", count);return 0;}。

第十一届蓝桥杯真题及答案

第十一届蓝桥杯真题及答案

第十一届蓝桥杯C++省赛B组真题和题解试题A:门牌制作题目【问题描述】小蓝要为一条街的住户制作门牌号。

这条街一共有2020位住户,门牌号从1到2020编号。

小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。

请问要制作所有的1到2020号门牌,总共需要多少个字符2?【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

题解答案:624#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <queue>#include <stack>#include <set>#include <cmath>#include <iostream>using namespace std;const int INF = 1e9;int cnt;void cal(int x){while(x){if(x % 10 == 2) cnt++;x /= 10;}}int main(){for(int i = 1; i <= 2020; i++){ cal(i);}cout << cnt;return 0;}试题B:既约分数题目【问题描述】如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。

例如,3/4,5/2,1/8,7/1都是既约分数。

请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)?【答案提交】这是一道结果填空题,你只需要算出结果后提交即可。

本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

蓝桥杯第六届c语言试题及答案

蓝桥杯第六届c语言试题及答案

蓝桥杯第六届c语言试题及答案蓝桥杯第六届C语言试题及答案1. 选择题1.1. 以下哪个选项是C语言中的关键字?A. intB. integerC. varD. string答案: A1.2. C语言中,以下哪个运算符用于取模运算?A. %B. /C. *D. -答案: A2. 填空题2.1. 在C语言中,用于定义一个整型变量的关键字是____。

答案: int2.2. C语言中,用于数组定义的关键字是____。

答案: array3. 编程题3.1. 编写一个C语言程序,计算并输出100以内所有偶数的和。

答案:```c#include <stdio.h>int main() {int sum = 0;for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {sum += i;}}printf("Sum of even numbers from 1 to 100 is: %d\n", sum);return 0;}```3.2. 编写一个C语言程序,实现字符串反转。

答案:```c#include <stdio.h>#include <string.h>void reverseString(char* str) {int length = strlen(str);for (int i = 0; i < length / 2; i++) {char temp = str[i];str[i] = str[length - i - 1];str[length - i - 1] = temp;}}int main() {char str[] = "Hello, World!";reverseString(str);printf("Reversed string: %s\n", str);return 0;}```4. 简答题4.1. 简述C语言中指针的概念及其用途。

蓝桥杯练习题库 2基础练习题(含参考代码)分析

蓝桥杯练习题库 2基础练习题(含参考代码)分析

基础练习数列排序时间限制:1.0s 内存限制:512.0MB问题描述给定一个长度为n的数列,将这个数列按从小到大的顺序排列。

1<=n<=200输入格式第一行为一个整数n。

第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。

输出格式输出一行,按从小到大的顺序输出排序后的数列。

样例输入58 3 6 4 9样例输出3 4 6 8 9锦囊1使用排序算法。

锦囊2可以使用冒泡排序、排入排序等,也可以使用快速排序等更快的,还可以直接调用系统的函数。

#include <stdio.h>#include <stdlib.h>void Print(int *data,int n){int i;for(i=0;i<n;i++){printf("%d ",data[i]);}printf("\n");}int Split(int *data,int pre,int rear){int value=data[pre];while(pre<rear){while(data[rear]>=value && pre<rear) rear--;data[pre]=data[rear];while(data[pre]<value && pre<rear) pre++;data[rear]=data[pre];}data[pre]=value;return pre;}//快速排序void QuickSort(int *data,int pre,int rear){if(pre<rear){int mid=Split(data,pre,rear);QuickSort(data,pre,mid-1);QuickSort(data,mid+1,rear);}}int main(){int i;int n;int *data;scanf("%d",&n);data=(int *)malloc(sizeof(int)*n);for(i=0;i<n;i++){scanf("%d",&data[i]);}QuickSort(data,0,n-1);Print(data,n);return 0;}基础练习十六进制转八进制时间限制:1.0s 内存限制:512.0MB问题描述给定n个十六进制正整数,输出它们对应的八进制数。

蓝桥杯试题(真题)训练

蓝桥杯试题(真题)训练

蓝桥杯试题(真题)训练1. 运算符难度:5颗星c语⾔的compare函数⽐较两字符串⼤⼩1//使⽤c语⾔的compare函数⽐较两字符串⼤⼩返回值为-1,0,12string s1 = "asd",s2 = "asd";3int t = pare(s2);//逐个⽐较字母,若t=-1,说明 s1<s2 ; 若t=1,说明 s1>s2 ; 若t=0,说明 s1=s2 ;4 cout<<t<<endl;思路:使⽤两个函数:toNumber(string s,int c)、toString(long long n,int c)对于toNumber(string s,int c)函数作⽤:将c进制的s2字符串转为10进制的数字对于toString(long long n,int c)函数作⽤:将10进制的n数字转为c进制的字符串对于该题,我们运算中的数字都转为10进制去运算,所以我们的数字平时都以10进制保存(输⼊s2之后,使⽤toNumber(s2,c)转为10进制)当我们需要输出答案时,再将运算结果⽤c进制输出(toString(res,c))代码:注明:易错点都已在源代码中标出。

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;//将c进制的s字符串转换为10进制的数字long long toNumber(string s,int c){ //第四处:返回数据应为long long型int len = s.length();long long n = 0;for(int i = 0;i<len;i++){if(s[i] >= 'A') n = (s[i]-'A'+10) + n*c;else n = (s[i]-'0') + n*c;}return n;}//将10进制的数字n转换为c进制的字符串sstring toString(long long n,int c){string s;if(n == 0) return"0"; //第⼀处:忘记考虑n=0的情况while(n){long long t = n%c; //第⼆处:t的数据范围错误写成intif(t>=10) s.push_back(t-10+'A');else s.push_back(t+'0');n/=c;}reverse(s.begin(),s.end());return s;}int main(){//n表⽰操作数,c表⽰当前进制单位,isclear标记前⾯的数是否被清除//p表⽰操作符序号int n,c=10,isclear = 1,p=0;cin>>n;//s1表⽰操作,s2表⽰数字string s1,s2;long long res,num;while(n--){cin>>s1;if(!pare("NUM")){cin>>s2;if(isclear){//说明前⾯的数已经被清除res = toNumber(s2,c);//说明s2为c进制的数,将s2转为10进制的数字isclear = 0; //第六处:记得将isclear的值设为0}else{ //说明前⾯有数num = toNumber(s2,c);if(p==1) res+=num;else if(p==2) res-=num;else if(p==3) res*=num;else if(p==4) res/=num;else if(p==5) res%=num;p=0; //第7处:记得将p的值设为0}}else if(!pare("ADD")){p=1;}else if(!pare("SUB")){p=2;}else if(!pare("MUL")){p=3;}else if(!pare("DIV")){p=4;}else if(!pare("MOD")){p=5;}else if(!pare("CHANGE")){cin>>c;}else if(!pare("EQUAL")){ //平时计算都以10进制,输出将res化为c进制cout<<toString(res,c)<<endl; //第三处:输出没加换⾏}else if(!pare("CLEAR")){//表⽰将前⾯的数清除isclear = 1; //第五处:总容易误写成将isclear=1写成c=1,导致样例输出结果为40 }}return0;}2. 求“连通块数⽬”题tarjan算法或者并查集需复习并查集解法:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;//并查集算法 find and union函数#define maxn 1000010int pre[maxn];int m,n,k,cnt;void Init(){for(int i = 1;i<=m*n;i++){pre[i]=i;}cnt = m*n; //cnt表⽰刚开始的根节点数⽬}int myFind(int a){if(a == pre[a]) return a;else return pre[a]=myFind(pre[a]);}void myunion(int a,int b){int aroot = myFind(a);int broot = myFind(b);if(aroot != broot){pre[broot] = aroot;//易错点:需注意,不要写成pre[b]=a;cnt--;}}int main(){cin>>m>>n;Init();cin>>k;while(k--){int a,b;cin>>a>>b;myunion(a,b);}cout<<cnt<<endl;}3. 回溯搜索每次可以进⾏两种操作:新建考场或者某⼀个之前的考场需复习1 #include<iostream>2 #include<cstdio>3 #include<algorithm>4using namespace std;56#define maxn 1057int n,m,ans=99999;8int f[maxn][maxn]={0};9int a[maxn]={0};//a[i]存第i个⼈所在的考场1011bool Judge(int x,int room){ //判断第x个⼈是否能使⽤第room个考场12for(int i=1;i<=n;i++){13if((f[x][i]==1)&&(a[i]==room)){ //说明该考场存在与x有关系的⼈14return false;15 }16 }17return true;18}1920void solve(int x,int room_num){21if(room_num>=ans){ //剪枝注意:我这⾥如果少了=,评测机会判断超时...22return;23 }24if(x>n){ //说明安排考场任务结束25 ans=min(ans,room_num);26return;27 }28//判断是否可以使⽤之前的某个考场29for(int i=1;i<=room_num;i++){30if(Judge(x,i)==true){31 a[x]=i;32 solve(x+1,room_num);33 a[x]=0;34 }35 }36//前⾯那些考场⽆法使⽤,需新建考场37 a[x]=room_num+1;38 solve(x+1,room_num+1);39 a[x]=0;40}4142int main(){43int x,y;44 cin>>n>>m;45while(m--){46 cin>>x>>y;47 f[x][y]=f[y][x]=1;48 }4950 solve(1,0);51 cout<<ans<<endl;52 }4.⼩数第n位思维题:模拟除法需复习注意:我们需判断是否需要对代码进⾏优化,不优化是否会超数据范围,超时之类的...很明显,该题需进⾏优化,对数据逼近防⽌超时---------易错点:注意变量的数据类型,int与long long的区别#include <iostream>using namespace std;int main(){long long i,a,b,n;cin>>a>>b>>n;a=a%b;//若n过⼤,加⼀个while快速逼近⼩数点后第n位的位置while(n>10){a*=1e10;n-=10;a%=b;}for(i=1;i<=n+2;i++) //注意:i的数据类型{a*=10;if(i>=n){cout<<a/b;}a%=b;}return0;}⼆分查找⽅法:这个要记住背诵binary_search(a,a+N,t)==true//表明在数组a中存在t这个数字下标=lower_bound(a,a+N,t)-a;//得到>=t这个数的下标5.对局匹配需复习算法思想:动态规划求:最多可以存在多少名(任意两名⽤户积分差不等于K)我们对⽤户的积分进⾏整理(对k取余,余数相同的积分在同⼀分组):0,0+k,0+2k...1,1+k,1+2k...2,2+k,2+2k...只有在同⼀个分组的⽤户才可能积分差等于K所以我们先求出每⼀个分组的最多可存在⽤户⼈数最后总和分组得到答案对每⼀个分组进⾏状态转移⽅程:f[j]=max(f[j-1],f[j-2]+num[j]);f[j]:表⽰ [该分组] 到第i个元素的最⼤⽤户⼈数对于积分i我们选或者不选完全取决于它的⽤户个数,⽽如果选积分i,那么积分i-k与积分i+k是不可选的,⽽如果不选积分i,那么积分i-k与积分i+k是可选的,所以:num[i]=max(num[i-k],num[i]+num[i+k])1 #include<iostream>2 #include<algorithm>3using namespace std;4#define maxn 1000015int n,k,ans;6//hsh[i]表⽰积分为i的⽤户⼈数7//下⾯两个数组每在⼀个分组中就重新赋值; 同⼀分组的余数t相同:t,k+t,2*k+t,3*k+t...8//num[i]存该分组的第i个元素的⽤户⼈数9//f[i]存该分组到第i个元素的最⼤⽤户⼈数 , 最⼤⽤户⼈数的关系:a,a+k,a+2*k , max(num[a]+num[a+2*k],num[a+k])10int hsh[maxn]={0},num[maxn]={0},f[maxn]={0};11int main(){12 cin>>n>>k;13 ans=0;14int t,i,j;15for(i=0;i<n;i++){16 cin>>t;17 hsh[t]++;18 }19if(k==0){//重复积分只取⼀个20for(i=1;i<maxn;i++){21if(hsh[i]!=0){22 ans++;23 }24 }25 }26else{27for(i=0;i<k;i++){//k个分组28int m=1;29for(j=i;j<maxn;j+=k){ //j为该分组的积分值,范围在(i,maxn)30 num[m++]=hsh[j];//hsh[j]为积分值为j时的⽤户⼈数31 }32 f[1]=num[1];33for(j=2;j<=m;j++){ //注意:这⾥的j⼀定要从2开始,否则下⾯的j-2会下标越界34 f[j]=max(f[j-1],f[j-2]+num[j]);35 }36 ans+=f[m];37 }38 }39 cout<<ans<<endl;40return0;41 }2.递推写法#include<iostream>#include<algorithm>using namespace std;#define maxn 100001int has[maxn]={0},d[maxn]={0};int main(){int n,k;cin>>n>>k;for(int i=0;i<n;i++){int x;cin>>x;has[x]++;}int ans=0;if(k==0){for(int i = 1; i < maxn; i++)ans += (bool)has[i];}else{for(int i=0;i<k;i++){//k个分组int sum=0;d[i]=has[i],d[i+k]=has[i+k];for(int j=i+2*k;j<maxn;j+=k){d[j]=max(d[j-k],d[j-2*k]+has[j]);//递推关系式sum=max(d[j],sum);}ans+=sum;}}cout<<ans<<endl;return0;}View Code6.发现环并查集+dfs思路:并查集找到环上的某点之后,进⾏递归求该环上的所有点代码:#include <cstdio>#include<iostream>#include <algorithm>#include<vector>using namespace std;const int maxn = 100001;int n;int f[maxn],flag,vis[maxn]={0};vector<int> g[maxn],ans;int Find(int x){return f[x]==x?x:f[x]=Find(f[x]);}bool dfs(int x){if(vis[x]){if(x==flag){ //说明递归结束return true;}else{ //说明回溯到前⾯经过的某节点return false;}}vis[x]=1;for(int i=0;i<g[x].size();i++){if(dfs(g[x][i])){ans.push_back(g[x][i]);return true;}}return false;}int main(){cin>>n;int x,y;//并查集⼀定要记得初始化for(int i=0;i<n;i++) f[i]=i;for(int i=0;i<n;i++){cin>>x>>y;g[x].push_back(y);g[y].push_back(x);int rootx=Find(x), rooty=Find(y);//并查集找到环的某点if(rootx!=rooty){f[rootx]=rooty;}else{//两个祖宗节点相同,说明是环节点flag=x;dfs(x);//找到环上的点后进⾏递归}}sort(ans.begin(),ans.end());for(int i=0;i<ans.size();i++)cout<<ans[i]<<"";return0;}7. 简单题#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define maxn 1001int main(){char a[maxn],b[maxn];scanf("%s%s",&a,&b);int len=strlen(a),cnt=0;for(int i=0;i<len;i++){if(a[i]==b[i]) continue;else{ //遍历过去,发现两个字符不相等的话,操作加⼀,把后⾯字符b[i+1]反转即可 cnt++;if(b[i+1]=='o') b[i+1]='*';else b[i+1]='o';}}cout<<cnt<<endl;return0;}7.错误票据简单题读题+简单哈希#include<iostream>using namespace std;#define maxn 100001int has[maxn]={0};int main(){int n,x;cin>>n;int A=maxn,B=0;for(int i=0;i<n;i++){while(cin>>x){has[x]++;if(x<A) A=x;if(x>B) B=x;char ch = getchar();if(ch=='\n') break;}}int d,c;//从题意可知,只有⼀个断数和重复数,总的数⽬为B-A+1个数字for(int i=A;i<=B;i++){if(has[i]==2) c=i;//hash值为2.说明这个数有重复if(has[i]==0) d=i;//hash值为0.说明这个数没有输⼊过}cout<<d<<""<<c<<endl;return0;}-------------------continue--------------------。

蓝桥杯题库及答案python版

蓝桥杯题库及答案python版

蓝桥杯题库及答案python版这是一道结果填空的题,只需要算出一个整数作为结果提交即可。

input_str=input()num=len(input_str)searched=[]foriinra nge(num):forjinrange(num):ifstr(input_str[j:j+i:])noti nsearched:searched.append(str(input_str[j:j+i:]))print (len(searched))输出结果为:100(2)年号字串小明用字母 A 对应数字1,B 对应2,以此类推,用 Z 对应26。

对于27以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对 329。

请问2019对应的字符串是什么?该题就是一个进制转换的问题,将十进制转换为26进制,因为是1~26,其中只有26个数,所以虽然是满27才进位,但应该是转26进制。

string='ABCDEFGHIJKLMNOPQRSTUVWXYZ'num=2019yu=[]whilen um>=26:yu.append(num%26)num=num//26yu.append(num)forii nyu[::-1]:print(string[i-1],end='')输出结果为:BYQ(3)数列求值【问题描述】给定数列 1, 1, 1, 3,5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。

求第项的最后 4 位数字。

【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个 4 位整数(提示:答案的千位不为0),在提交答案时只填写这个整数,填写多余的内容将无法得分。

arr=[0foriinrange()]arr[0]=arr[1]=arr[2]=1foriinrange( 3,):arr[i]=(arr[i-1]+arr[i-2]+arr[i-3])%10000#这个求余可以保证每一次计算只保留后四位(4个0)#但是不会影响数列的计算,因为数列的后几位都是由后面决定的,所以前面舍去也不会影响后几位的值print(arr[])输出为:4659(4)数的分解把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和4,一共有多少种不同的分解方法?注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18和 1001+1000+18 被视为同一种。

蓝桥杯python语言试题及答案

蓝桥杯python语言试题及答案蓝桥杯Python语言试题及答案1. 题目:编写一个Python函数,计算给定列表中所有数字的和。

答案:```pythondef sum_of_list(numbers):return sum(numbers)```2. 题目:编写一个Python函数,判断给定字符串是否为回文。

答案:```pythondef is_palindrome(s):return s == s[::-1]```3. 题目:给定一个整数数组,请编写一个Python函数,找出数组中第二大的数。

答案:```pythondef second_largest(numbers):unique_numbers = set(numbers)if len(unique_numbers) < 2:return Noneunique_numbers = sorted(unique_numbers, reverse=True)return unique_numbers[1]```4. 题目:编写一个Python函数,实现字符串的反转。

答案:```pythondef reverse_string(s):return s[::-1]```5. 题目:给定一个整数n,请编写一个Python函数,返回n的阶乘。

答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)```6. 题目:编写一个Python函数,实现斐波那契数列的第n项。

答案:```pythondef fibonacci(n):if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n - 1) + fibonacci(n - 2)```7. 题目:编写一个Python函数,检查一个整数是否为素数。

蓝桥杯结果填空_附参考答案

结果填空题1.空瓶换汽水浪费可耻,节约光荣。

饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料。

刚好小明前两天买了2瓶该饮料喝完了,瓶子还在。

他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一瓶该饮料,喝完还瓶!!饮料店老板一统计,已经售出该饮料且未还瓶的有12345瓶,那么如果这些饮料的买主都如小明一样聪明,老板最多还需要送出多少瓶饮料呢?显然答案是个正整数。

参考答案:12345/2=617261722.三人年龄三个神秘蒙面人来访F博士。

博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁。

我们3人年龄总和为70岁。

且我们三人年龄的乘积是所有可能情况中最大的。

请帮助F博士计算他们的年龄,从小到大排列,用逗号分开。

解答:年龄最小的最大值是19,因为三人年龄的乘积是最大的,所以x=19,Y+Z=70-19=51,当Y=25(或Z=25),Z=26(或Y=26)时三人年龄的积达到最大参考答案:19,25,263.考察团组成某饭店招待国外考察团。

按照标准,对领导是400元/人,随团职员200元/人,对司机50元/人。

考察团共36人,招待费结算为3600元,请问领导、职员、司机各几人。

答案是三个整数,用逗号分隔。

我的答案:#include<stdio.h>void main(){int a,b,c;for(a=0;a<9;a++){for(b=0;b<16;b++){for(c=0;c<60;c++){if(a+b+c==36&&a*400+b*200+c*50==3600){printf("a=%d,b=%d,c=%d",a,b,c);}}}}}结果两种情况:0,12,243,5,28参考答案:3,5,28#include<stdio.h>void main(){int a,b,c;for(a=0;a<9;a++){for(b=0;b<12;b++){for(c=0;c<60;c++){if(a+b+c==36&&a*400+b*200+c*50==3600){printf("a=%d,b=%d,c=%d",a,b,c);}}}}}4.微生物增殖假设有两种微生物X 和YX出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

第1-7届蓝桥杯决赛试题及答案

第1-7届蓝桥杯决赛试题及答案2011年第1届蓝桥杯决赛试题及答案1.四方定理数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示。

我们可以通过计算机验证其在有限范围的正确性。

对于大数,简单的循环嵌套是不适宜的。

下面的代码给出了一种分解方案。

请仔细阅读,填写空缺的代码(下划线部分)。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。

直接写在题面中不能得分。

int f(int n, int a[], int idx){if(______________) return 1; // 填空1if(idx==4) return 0;for(int i=(int)sqrt(n); i>=1; i--){a[idx] = i;if(_______________________)return 1; // 填空2}return 0;}int main(int argc, char* argv[]){for(;;){int number;printf("输入整数(1~10亿):");scanf("%d",&number);int a[] = {0,0,0,0};int r = f(number, a, 0);printf("%d: %d %d %d %d\n", r, a[0], a[1], a[2], a[3]);}return 0;}2.加密在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。

解密的方法就是再执行一次同样的操作。

加密过程中n位二进制数会循环使用。

并且其长度也可能不是8的整数倍。

下面的代码演示了如何实现该功能。

请仔细阅读,填写空缺的代码(下划线部分)。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。

蓝桥杯试题和答案

/*很久以前,T王国空前繁荣。

为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。

同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

J是T国重要大臣,他巡查于各大城市之间,体察民情。

所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。

他有一个钱袋,用于存放往来城市间的路费。

聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。

也就是说走1千米花费11,走2千米要花费23。

J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?输入格式:输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数城市从1开始依次编号,1号城市为首都。

接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di 千米。

输出格式:输出一个整数,表示大臣J最多花费的路费是多少。

样例输入:51 2 21 3 12 4 52 5 4样例输出:135样例说明:大臣J从城市4到城市5要花费135的路费。

*/#include<stdio.h>#include<string.h>int a[1000][1010];int main(){int i,j,k,n,x,y,z,max,sum;scanf("%d",&n);for(i=0;i<=n;i++)for(j=0;j<=n;j++)a[i][j]=999999;for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);a[x][y]=z;a[y][x]=z;}max=sum=0;for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i!=j){a[i][j]=a[i][k]+a[k][j]<a[i][j]?a[i][k]+a[k][j]:a[i][j];}for(i=0;i<=n;i++)for(j=0;j<=n;j++)if(a[i][j]<999999)max=a[i][j]>max?a[i][j]:max;for(i=1;i<=max;i++)sum+=(i+10);printf("%d\n",sum);return0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法训练编号:ALGO-1题目:区间k大数查询列关键字:排序查找类型:普通试题问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。

序列元素从1开始标号。

输出格式总共输出m行,每行一个数,表示询问的答案。

样例输入51 2 3 4 521 5 22 3 2样例输出42数据规模与约定对于30%的数据,n,m<=100;对于100%的数据,n,m<=1000;保证k<=(r-l+1),序列中的数<=1000000。

本题的Java参考代码如下:import class Main{private static BufferedInputStream in = new BufferedInputStream;public static void main(String[] args) throws IOException{int[] nums = new int[readInt()];for(int i=0; i<; i++){nums[i] = readInt();}for(int i=readInt(); i>0; i--){int a = readInt();int b = readInt();int c = readInt();int[] tn = new int[b-a+1];for(int j=0; j<; j++){tn[j] = nums[a-1+j];}(tn);}}private static int readInt() throws IOException {int i,sum=0;while(((i=())&48) != 48 || i>57);for(;(i&56) == 48 || (i&62) == 56; i=())sum = sum*10 + (i&15);return sum;}}编号:ALGO-2题目:最大最小公倍数关键字:贪心类型:普通试题问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式输入一个正整数N。

输出格式输出一个整数,表示你找到的最小公倍数。

样例输入9样例输出504数据规模与约定1 <= N <= 1000000。

本题的Java参考代码如下:import class Main{public static void main(String[] args) {Scanner sc = new Scanner;int n = ();long anser = 1;switch (n) {case 95152:;public class Main {public static void main(String[] args) throws IOException {BufferedReader bfr = new BufferedReader(new InputStreamReader); String s[] = ().split(" +");int K = (s[0]);int L = (s[1]);int f[][] = new int[L][K];int i,j,k,sum=0;for(j=0;j<K;j++) f[0][j] = 1;f[0][0]=0;if(L>1){for(i=1;i<L;i++){for(j=0;j<K;j++){for(k=0;k<K;k++)if(k!=j-1 && k!=j+1){f[i][j]+=f[i-1][k];f[i][j]%=07;}}}}for(j=0;j<K;j++) { sum+=f[L-1][j]; sum%=07; }}}编号:ALGO-4题目:节点选择关键字:树形动态规划类型:普通试题问题描述有一棵 n 个节点的树,树上每个节点都有一个正整数权值。

如果一个点被选择了,那么在树上和它相邻的点都不能被选择。

求选出的点的权值和最大是多少?输入格式第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式输出一个整数,代表选出的点的权值和的最大值。

样例输入51 2 3 4 51 21 32 42 5样例输出12样例说明选择3、4、5号点,权值和为 3+4+5 = 12 。

数据规模与约定对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。

本题的Java参考代码如下:import .*;public class Main {final static int MAX_N = 100010;xt) {int v = E[i].v;if (vis[v]) continue;Ed = true;sta[top++] = v;vis[v] = true;}if (Ed) continue;--top;for (int i = head[u]; i + 1 != 0; i = E[i].nxt) {int v = E[i].v;dp[v][0] += (dp[u][0], dp[u][1]);dp[v][1] += dp[u][0];}}}void run() throws IOException {int n = ();for (int i = 1; i <= n; ++i)dp[i][1] = ();(head, -1);for (int i = 1; i < n; ++i) {int u = ();int v = ();add(u, v);add(v, u);}dfs(1, -1);int ans = (dp[1][0], dp[1][1]);(ans);();}public static void main(String[] args) throws IOException { new Main().run();}Main() {cin = new InputReader;;import .*;class Main{static int n,m;static int[] u;static int[] v;static int[] w;static int[] d;static int[] first;static int[] next;static Queue<Integer> q=new LinkedList<Integer>();static boolean[] inq;public static void main(String[] args) throws IOException{int i;BufferedReader bfr=new BufferedReader(new InputStreamReader);String str = ();String[] s = ("\\s");n=(s[0]);m=(s[1]);n++;m++;u=new int[m];v=new int[m];w=new int[m];first=new int[n];next=new int[m];d=new int[n];inq=new boolean[n];for(i=1;i<n;i++)first[i]=-1;for(i=1;i<m;i++){str = ();s = (" ");u[i]=(s[0]);v[i]=(s[1]);w[i]=(s[2]);next[i]=first[u[i]]; first[u[i]]=i;}spfa(1);for(i=2;i<n;i++)}public static void spfa(int s){int i,x;for(i=2;i<n;i++)d[i]=;(s);while(!()){x=();inq[x]=false;for(i=first[x];i!=-1;i=next[i])if(d[v[i]]>d[x]+w[i]){d[v[i]]=d[x]+w[i];if(!inq[v[i]]){inq[v[i]]=true;(v[i]);}}}}}编号:ALGO-6题目:安慰奶牛关键字:最小生成树类型:普通试题问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。

道路被用来连接N 个牧场,牧场被连续地编号为1到N。

每一个牧场都是一个奶牛的家。

FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间的连通性。

你首先要决定那些道路是需要保留的N-1条道路。

第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。

没有两个牧场是被一条以上的道路所连接。

奶牛们非常伤心,因为她们的交通系统被削减了。

你需要到每一个奶牛的住处去安慰她们。

每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。

你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。

在早上起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。

这样你才能完成你的交谈任务。

假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci。

接下来P行,每行包含三个整数Sj, Ej和Lj。

输出格式输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。

样例输入5 71010206301 2 52 3 52 4 123 4 172 5 153 5 6样例输出176数据规模与约定5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

本题的Java参考代码如下:import Reader3{static BufferedReader reader;static StringTokenizer tokenizer;static void init(InputStream input){reader=new BufferedReader(new InputStreamReader(input));tokenizer=new StringTokenizer("");}static String next() throws IOException{while (!()) {tokenizer = new StringTokenizer());}return ();}static int nextInt() throws IOException{return (next());}static double nextDouble() throws IOException{return (next());}}class KruskalDui{int a,b,l;}public class Main{/*** @param args* @throws IOException*/static int father[]=new int[100000];static ArrayList<KruskalDui> path =new ArrayList<KruskalDui>();public static int getfather(int x) {if (x!=father[x]) {father[x]=getfather(father[x]);}return father[x];}public static void _qst_w(int l,int r) {int i=l,j=r,mw=((i+j)/2).l;while(i<=j){while(i).l<mw) i++;while(j).l>mw) j--;if(i<=j){(path,i,j);i++;j--;}}if(l<j) _qst_w(l,j);if(i<r) _qst_w(i,r);}public static void main(String[] args) throws IOException { ;fy=getfather(k).b);if(fx!=fy){father[fx]=fy;result+=(k).l;count++;}k++;}}}编号:ALGO-7题目:逆序对关键字:平衡二叉树类型:普通试题问题描述Alice是一个让人非常愉跃的人!他总是去学习一些他不懂的问题,然后再想出许多稀奇古怪的题目。

相关文档
最新文档