蓝桥杯作业4版本2.docx
- 文档编号:23024582
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:25
- 大小:172.17KB
蓝桥杯作业4版本2.docx
《蓝桥杯作业4版本2.docx》由会员分享,可在线阅读,更多相关《蓝桥杯作业4版本2.docx(25页珍藏版)》请在冰豆网上搜索。
蓝桥杯作业4版本2
1、出栈次序
X星球特别讲究秩序,所有道路都是单行线。
一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。
那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
现在足足有16辆车啊,亲!
需要你计算出可能次序的数目。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性文字)。
代码设计:
#include
usingnamespacestd;
intmain()//卡特兰数:
h[1]=1;h[n]=h[n-1]*(4*n-2)/(n+1)
{
intn,h[20];
h[1]=1;
for(n=2;n<=16;n++)
{
h[n]=h[n-1]*(4*n-2)/(n+1);
}
cout< return0; } 运行结果: 2、格子刷油漆(动规) X国的一段古城墙的顶端可以看成2*N个格子组成的矩形(如图1所示),现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩! ) 比如: adbcef就是合格的刷漆顺序。 cefdab是另一种合适的方案。 当已知N时,求总的方案数。 当N较大时,结果会迅速增大,请把结果对1000000007(十亿零七)取模。 输入数据为一个正整数(不大于1000) 输出数据为一个正整数。 例如: 用户输入: 2 程序应该输出: 24 再例如: 用户输入: 3 程序应该输出: 96 再例如: 用户输入: 22 程序应该输出: 359635897 资源约定: 峰值内存消耗<64M CPU消耗<1000ms 请严格按要求输出,不要画蛇添足地打印类似: “请您输入...”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中#include 提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。 代码设计: #include usingnamespacestd; intNUM=1000000007; intmain() { inti,n; longlonga[1001]={0},b[1001]={0}; cin>>n; b[1]=1; for(i=2;i<=n;i++) b[i]=(b[i-1]*2%NUM); a[1]=1; a[2]=6; for(i=3;i<=n;i++) a[i]=(2*a[i-1]+b[i]+4*a[i-2])%NUM; longlongsum=4*a[n]; for(i=2;i { sum+=((8*b[n-i]*a[i-1])%NUM+(8*a[n-i]*b[i-1])%NUM)%NUM; sum%=NUM; } if(n==1)sum=2; cout< return0; } 运行结果: 3、(排列组合)暴力破解: 1.循环嵌套2.递归 递归暴力破解的基础: 生成全排列 ABC ACB BAC BCA CAB CBA ------- AAABBCCDFFF 取3个 代码设计: #include usingnamespacestd; intsum=0; voidf(inta[],intk,intm) { if(k==3) { sum++; return; } if(m==5)return; for(inti=0;i<=a[m];i++) { f(a,k+i,m+1);//填空位置 } } intmain() { inta[]={3,2,2,1,3};//字符串中ABCDF数量 f(a,0,0); cout< return0; } 运行结果: 4、牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢? 请填写该整数,不要填写任何多余的内容或说明文字。 代码设计: #include usingnamespacestd; intsum=0; voidf(intn,intm)//n牌的大小,m手牌的总数 { if(m>13)return; if(n==13) { if(m==13)sum++;//遍历了全部的牌且手牌共13张 return; } for(inti=0;i<=4;i++)//每种牌的数量 f(n+1,m+i); } intmain() { f(0,0); cout< return0; } 运行结果: 5、小明参加了学校的趣味运动会 其中的一个项目是: 跳格子。 比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳相邻的格子里,但不能跳到对角的格子里。 格子中写的字如下(或参看p1.jpg): 从我做起振 我做起振兴 做起振兴中 起振兴中华 要求跳过的路线刚好构成“从我做起振兴中华”这句话。 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,请通过浏览器直接提交该数字。 注意: 不要提交解答过程,或其它辅助说明类的内容。 答案: 35 分析: 完成需要7步,3步向下,4步向前,则在7步中任选3步向下,即C(7,3) 7*6*5/3/2=35 6、(概率) 班级中有50名同学,求有至少两个人生日相同的概率。 关于日期问问题的处理建议不要依赖于系统函数,不靠谱! 因为严格讲: 时间、日期问题十分复杂 但根据需求,可以简单处理。 代码设计: #include usingnamespacestd; intmain() { doublesum=1,n;//sum for(inti=365;i>315;i--)//生日都不同的概率 { n=i; sum=sum*(n/365); } cout<<1-sum; return0; } 运行结果: 7、(算法几何)车轮轴迹 栋栋每天骑自行车回家需要经过一条狭长的林荫道。 道路由于年久失修,变得非常不平整。 虽然栋栋每次都很颠簸,但他仍把骑车经过林荫道当成一种乐趣。 由于颠簸,栋栋骑车回家的路径是一条上下起伏的曲线,栋栋想知道,他回家的这条曲线的长度究竟是多长呢? 更准确的,栋栋想知道从林荫道的起点到林荫道的终点,他的车前轮的轴(圆心)经过的路径的长度。 栋栋对路面进行了测量。 他把道路简化成一条条长短不等的直线段,这些直线段首尾相连,且位于同一平面内。 并在该平面内建立了一个直角坐标系,把所有线段的端点坐标都计算好。 假设栋栋的自行车在行进的过程中前轮一直是贴着路面前进的。 图1给出了一个简单的路面的例子,其中蓝色实线为路面,红色虚线为车轮轴经过的路径。 在这个例子中,栋栋的前轮轴从A点出发,水平走到B点,然后绕着地面的F点到C点(绕出一个圆弧),再沿直线下坡到D点,最后水平走到E点,在这个图中地面的坐标依次为: (0,0),(2,0),(4,-1),(6,-1),前轮半径为1.50,前轮轴前进的距离依次为: AB=2.0000;弧长BC=0.6955;CD=1.8820;DE=1.6459。 总长度为6.2233。 图2给出了一个较为复杂的路面的例子,在这个例子中,车轮在第一个下坡还没下完时(D点)就开始上坡了,之后在坡的顶点要从E绕一个较大的圆弧到F点。 这个图中前轮的半径为1,每一段的长度依次为: AB=3.0000;弧长BC=0.9828;CD=1.1913;DE=2.6848;弧长EF=2.6224;FG=2.4415;GH=2.2792。 总长度为15.2021。 现在给出了车轮的半径和路面的描述,请求出车轮轴轨迹的总长度。 输入的第一行包含一个整数n和一个实数r,用一个空格分隔,表示描述路面的坐标点数和车轮的半径。 接下来n行,每个包含两个实数,其中第i行的两个实数x[i],y[i]表示描述路面的第i个点的坐标。 路面定义为所有路面坐标点顺次连接起来的折线。 给定的路面的一定满足以下性质: *第一个坐标点一定是(0,0); *第一个点和第二个点的纵坐标相同; *倒数第一个点和倒数第二个点的纵坐标相同; *第一个点和第二个点的距离不少于车轮半径; *倒数第一个点和倒数第二个点的的距离不少于车轮半径; *后一个坐标点的横坐标大于前一个坐标点的横坐标,即对于所有的i,x[i+1]>x[i]。 输出一个实数,四舍五入保留两个小数,表示车轮轴经过的总长度。 你的结果必须和参考答案一模一样才能得分。 数据保证答案精确值的小数点后第三位不是4或5。 【样例输入1】 41.50 0.000.00 2.000.00 4.00-1.00 6.00-1.00 【样例输出1】 6.22 【样例说明1】 这个样例对应图1。 【样例输入2】 61.00 0.000.00 3.000.00 5.00-3.00 6.002.00 7.00-1.00 10.00-1.00 【样例输出2】 15.20 【样例说明2】 这个样例对应图2 【数据规模与约定】 对于20%的数据,n=4; 对于40%的数据,n≤10; 对于100%的数据,4≤n≤100,0.5≤r≤20.0,x[i]≤2000.0,-2000.0≤y[i]≤2000.0。 资源约定: 峰值内存消耗<64M CPU消耗<1000ms 请严格按要求输出,不要画蛇添足地打印类似: “请您输入...”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中#include 提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。 ====================== 计算几何题目: 四舍五入的陷阱 3.49999===>3 3.50000===>4 概率上不公平 四舍六入五成双 -------------------------- 大数运算 Math.BigIntegerMath.BigDecimal c手写 递归.....分块乘法 代码设计: #include #include #include #definepi3.1415926 usingnamespacestd; doublesum=0; voidjisuan(doublex1,doubley1,doublex2,doubley2,doublex3,doubley3,doubler) { doubledl; doublecy=(y1+y3)/2; doubleflagy=cy-y2;//凸起和下凹的标志位 doublemx=x2-x1; doublemy=y2-y1; doublenx=x2-x3; doubleny=y2-y3; doublem=sqrt(mx*mx+my*my); doublen=sqrt(nx*nx+ny*ny); sum+=n; doublecos=(mx*nx+my*ny)/(m*n); doubleangle=acos(cos); if(flagy>0) { dl=2*r/tan(angle/2); sum-=dl; } else { angle=pi-angle; dl=r*angle; sum+=dl; } } doublelen(doublex[],doubley[],doubler,intn) { sum=sum+sqrt((x[1]-x[0])*(x[1]-x[0])+(y[1]-y[0])*(y[1]-y[0])); for(inti=1;i { jisuan(x[i-1],y[i-1],x[i],y[i],x[i+1],y[i+1],r); } returnsum; } intmain() { intn; doubler; doublex[100],y[100]; cin>>n>>r; for(inti=0;i { cin>>x[i]; cin>>y[i]; } printf("%.2f",len(x,y,r,n)); return0; } 运行结果: 8、(图论)大臣的旅费 很久以前,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最多花费的路费是多少。 样例输入: 5 122 131 245 254 样例输出: 135 样例说明: 大臣J从城市4到城市5要花费135的路费。 资源约定: 峰值内存消耗<64M CPU消耗<5000ms 请严格按要求输出,不要画蛇添足地打印类似: “请您输入...”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中#include 提交时,注意选择所期望的编译器类型。 代码设计: #include usingnamespacestd; #defineN101 intdp[N][N]; intmain() { intn,i,j,k,a,b,d,longest=0,sum=0; for(i=1;i for(j=1;j dp[i][j]=100000;//代表无限大 for(i=1;i dp[i][i]=0; cin>>n; for(i=0;i { cin>>a>>b>>d; dp[a][b]=d; dp[b][a]=d; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) dp[i][j]=dp[i][j]>dp[i][k]+dp[k][j]? dp[i][k]+dp[k][j]: dp[i][j];//floyd算法 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(dp[i][j]>longest) longest=dp[i][j]; cout< return0; } 运行结果: 9、(图论)网络寻路 X国的一个网络使用若干条线路连接若干个节点。 节点间的通信是双向的。 某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。 该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。 源地址和目标地址可以相同,但中间节点必须不同。 如图1所示的网络。 1->2->3->1是允许的 1->2->1->2或者1->2->3->2都是非法的。 输入数据的第一行为两个整数NM,分别表示节点个数和连接线路的条数(1<=N<=10000;0<=M<=100000)。 接下去有M行,每行为两个整数u和v,表示节点u和v联通(1<=u,v<=N,u! =v)。 输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。 输出一个整数,表示满足要求的路径条数。 例如: 用户输入: 33 12 23 13 则程序应该输出: 6 再例如: 用户输入: 44 12 23 31 14 则程序应该输出: 10 资源约定: 峰值内存消耗<64M CPU消耗<1000m 请严格按要求输出,不要画蛇添足地打印类似: “请您输入...”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中#include 提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。 代码设计: #include #include #include usingnamespacestd; #defineinf1000000000 intn,m,sum; vector intvis[10005]; voidf(intt,ints) { if(t==4) { sum++; return; } if(t==1)vis[s]=2;// elsevis[s]=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯 作业 版本