OpenJudge算法设计与分析习题解答
算法设计与分析习题答案1-6章
习题11.图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点 输出:相同的点 1, 一次步行2, 经过七座桥,且每次只经历过一次 3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法 1.r=m-n2.循环直到r=0 2.1 m=n 2.2 n=r 2.3 r=m-n 3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C ++描述。
//采用分治法//对数组先进行快速排序 //在依次比较相邻的差 #include <iostream> using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析第二版课后习题及解答(可编辑)
算法设计与分析第二版课后习题及解答算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求 //输入:一个正整数n2//输出:。
step1:a1; step2:若a*an 转step 3,否则输出a; step3:aa+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。
b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
a. gcd31415, 14142 gcd14142, 3131 gcd3131, 1618 gcd1618, 1513 gcd1513, 105 gcd1513, 105 gcd105, 43 gcd43, 19 gcd19, 5 gcd5, 4 gcd4, 1 gcd1, 0 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1?14142 和 2?14142之间,所以欧几里德算法比此算法快1?14142/11 ≈1300 与2?14142/11 ≈ 2600 倍之间。
6.证明等式gcdm,ngcdn,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和rm mod nm-qn;显然,若d能整除n和r,也一定能整除mr+qn和n。
数对m,n和n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcdm,ngcdn,r7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0mn的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcdm,ngcdn,m并且这种交换处理只发生一次.8.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?5次gcd5,8习题1.21.农夫过河P?农夫W?狼 G?山羊 C?白菜2.过桥问题1,2,5,10---分别代表4个人, f?手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c0的实根,写出上述算法的伪代码可以假设sqrtx是求平方根的函数算法Quadratica,b,c//求方程ax^2+bx+c0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D0temp←2*ax1←-b+sqrtD/tempx2←-b-sqrtD/tempreturn x1,x2else if D0 return ?b/2*ael se return “no real roots”else //a0if b≠0 return ?c/belse //ab0if c0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Kii0,1,2,商赋给n第二步:如果n0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBinn//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1n]中i1while n!0 doBin[i]n%2;nintn/2;i++;while i!0 doprint Bin[i];i--;9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.算法略对这个算法做尽可能多的改进.算法 MinDistanceA[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements 习题1.3考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[]4.古老的七桥问题第2章习题2.17.对下列断言进行证明:如果是错误的,请举例a. 如果tn∈Ogn,则gn∈Ωtnb.α0时,Θαgn Θgn解:a这个断言是正确的。
算法设计与分析习题解答
算法设计与分析习题解答第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得?n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得?n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得?n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得?n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:由于log(n!)=∑=ni i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
由于对所有的偶数n 有,log(n!)= ∑=ni i 1log ≥∑=nn i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
openjudge题库答案及解析
openjudge题库答案及解析作为一名程序员,我们时常需要刷LeetCode或者openjudge等算法题库来提升我们的编程能力。
然而,有时候面对一些看似极难的题目,我们可能会感到无从下手。
这时候,有一份题库答案及解析就可以帮助我们更快地理解和解决这些问题。
首先,让我们来了解一下openjudge。
openjudge是清华大学出品的一个在线评测系统,提供了大量的算法、编程题目,帮助学生提升编程能力。
除了编程题目,openjudge还提供了大量的在线课程、测试和编程教程。
如果你是一位大学生,openjudge将是你最好的练习场所。
那么,如何获取openjudge题库的答案及解析呢?其实很简单,我们可以通过搜索引擎或者各类算法社区来查找。
如果你已经解决了某个题目,但是还不是很确定自己的答案是否正确,可以直接搜索这道题目的题名+openjudge,一般就可以找到题目的解答及解析。
许多大神也会在网上写一些关于openjudge的算法题解,如果你想更深入地学习,这些题解也是非常有价值的。
接下来,我想给大家分享一些openjudge题目的答案及解析。
这些题目涵盖了一些基础的算法和数据结构,对于初学者是非常有帮助的。
第一个题目是“递归实现二分查找”。
这道题目比较基础,但是对于初学者来说还是有一定难度的。
我们可以直接通过递归函数来实现二分查找,代码如下:```python# 递归实现二分查找def binary_search(lst, val, l, r):if l > r:return -1mid = (l + r) // 2if lst[mid] == val:return midelif lst[mid] > val:return binary_search(lst, val, l, mid - 1)else:return binary_search(lst, val, mid + 1, r)```在这个递归函数当中,我们需要传入一个列表、要查找的值val、以及列表的左右边界l和r。
算法设计与分析课后部分习题答案
算法实现题3-7 数字三角形问题问题描述:给定一个由n行数字组成的数字三角形,如图所示。
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
编程任务:对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。
数据输入:有文件input.txt提供输入数据。
文件的第1行是数字三角形的行数n,1<=n<=100。
接下来的n行是数字三角形各行的数字。
所有数字在0-99之间。
结果输出:程序运行结束时,将计算结果输出到文件output.txt中。
文件第1行中的数是计算出的最大值。
输入文件示例输出文件示例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5源程序:#include "stdio.h" voidmain(){ intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量in=fopen("input.txt","r");fscanf(in,"%d",&n);//将行数n读入到变量n中for(i=0;i<n;i++)//将各行数值读入到数组triangle中for(j=0;j<=i;j++)fscanf(in,"%d",&triangle[i][j]);for(int row=n-2;row>=0;row--)//从上往下递归计算for(int col=0;col<=row;col++)if(triangle[row+1][col]>triangle[row+1][col+1])triangle[row][col]+=triangle[row+1][col];elsetriangle[row][col]+=triangle[row+1][col+1];out=fopen("output.txt","w");fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 }算法实现题4-9 汽车加油问题问题描述:一辆汽车加满油后可行驶nkm。
openjudge幼儿园足球题解析
Openjudge幼儿园足球题解析介绍幼儿园足球题是一个针对幼儿园学生的足球问题,主要考察幼儿对基本足球规则和运动技能的理解。
通过这道题目的分析和解析,我们将帮助幼儿更好地理解足球,并提高他们的足球技巧。
题目描述这题目要求幼儿假设自己是一个足球裁判,在比赛过程中需要判断球场上发生的事件,包括球是否出界、球是否进门等。
题目分析1.首先,幼儿需要明确足球比赛的规则,包括球场的尺寸、球的大小、比赛时间等。
2.幼儿需要了解什么情况下球算出界,例如球完全越过界线即算出界。
3.幼儿需要了解什么情况下球算进门,例如球完全越过门线即算进门。
4.幼儿需要学会观察判断球是否出界或进门,例如看球是否完全越过界线或门线。
解题思路1.首先,幼儿需要明确足球比赛的规则。
他们可以通过观看足球比赛、与教练或其他儿童讨论来获得这些知识。
2.幼儿需要学会观察判断球是否出界或进门。
他们可以通过观察标志着界线或门线的边界,以及球是否完全越过这些线来判断球的状态。
3.对于判断球是否出界,幼儿可以注意以下几点:–观察球是否完全越过边界线,而不是仅仅挨着边界线滚动。
–观察球是否碰到了横杆或立柱,如果球完全越过边界线但碰到了横杆或立柱,也算出界。
4.对于判断球是否进门,幼儿可以注意以下几点:–观察球是否完全越过门线,并且进入了球门内部。
–观察球是否从门的上方进入,如果球越过门线但是从门的上方进入,是不算进门的。
5.幼儿应该提醒他们自己保持专注,仔细观察比赛过程中的细节。
心得体会通过这道题目,幼儿可以加深对足球规则和技巧的理解。
同时,他们也可以培养他们观察力和判断力,提高他们在比赛中作为裁判的能力。
此外,幼儿还可以通过练习判断球是否出界和进门,来提高他们的反应速度和足球技巧。
结论幼儿园足球题目是一个帮助幼儿理解足球规则和提高判断力的练习题。
通过观察和判断,幼儿可以学会区分球是否出界和进门。
这道题目不仅可以提高幼儿的足球技巧,还可以培养他们的观察力和判断力。
算法设计与分析基础习题参考答案
习题5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d 能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次..对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.(农夫过河)P—农夫 W—狼 G—山羊 C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBin(n).n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A[0..n-1])n-1]a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=n)b.删除有序数组的第i个元素(依然有序)hints:a. Replace the ith element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element., 0 for an array of positive numbers ) to mark the ith position is empty. (“lazy deletion”)习题1欧几里得算法的时间复杂度欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式gcd(a, b) = gcd(b, a mod b)其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 算法如下:输入: 两个整数a, b输出: a和b的最大公约数function gcd(a, b:integer):integer;if b=0 return a;else return gcd(b, a mod b);end function欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth的TAOCP中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a和b的大小有怎样的关系?我们不妨设a>b>=1(若a<b我们只需多做一次模运算, 若b=0或a=b模运算的次数分别为0和1), 构造数列{un}: u0=a, u1=b, uk=uk-2 mod uk-1(k>=2), 显然, 若算法需要n次模运算, 则有un=gcd(a, b), un+1=0. 我们比较数列{un}和菲波那契数列{Fn}, F0=1<=un, F1=1<=un-1, 又因为由uk mod uk+1=uk+2, 可得uk>=uk+1+uk+2, 由数学归纳法容易得到uk>=Fn-k, 于是得到a=u0>=Fn, b=u0>=Fn-1. 也就是说如果欧几里得算法需要做n次模运算, 则b必定不小于Fn-1. 换句话说, 若 b<Fn-1, 则算法所需模运算的次数必定小于n. 根据菲波那契数列的性质, 有Fn-1>n/sqrt(5), 即b>n/sqrt(5), 所以模运算的次数为O(lgb)---以b为底数 = O(lg(2)b)---以2为底数,输入规模也可以看作是b的bit位数。
算法设计与分析基础习题答案
习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理"该算法在处理这种输入的过程中,上述情况最多会发生几次"Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法"(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法"(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.3考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗"c.该算法在位吗"解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=n)b.删除有序数组的第i个元素(依然有序)hints:a. Replace the ith element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element(e.g., 0 for an array of positive numbers ) to mark the ith position is empty. (“lazy deletion”)习题2.11欧几里得算法的时间复杂度欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式gcd(a, b) = gcd(b, a mod b)其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 算法如下:输入: 两个整数a, b输出: a和b的最大公约数function gcd(a, b:integer):integer;if b=0 return a;else return gcd(b, a mod b);end function欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth的TAOCP中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a 和b 的大小有怎样的关系"我们不妨设a>b>=1(若a<b 我们只需多做一次模运算, 若b=0或a=b 模运算的次数分别为0和1), 构造数列{un}: u0=a, u1=b, uk=uk-2 mod uk-1(k>=2), 显然, 若算法需要n 次模运算, 则有un=gcd(a, b), un+1=0. 我们比较数列{un}和菲波那契数列{Fn}, F0=1<=un, F1=1<=un-1, 又因为由uk mod uk+1=uk+2, 可得uk>=uk+1+uk+2, 由数学归纳法容易得到uk>=Fn-k, 于是得到a=u0>=Fn, b=u0>=Fn-1. 也就是说如果欧几里得算法需要做n 次模运算, 则b 必定不小于Fn-1. 换句话说, 若 b<Fn-1, 则算法所需模运算的次数必定小于n. 根据菲波那契数列的性质, 有Fn-1>(1.618)n/sqrt(5), 即b>(1.618)n/sqrt(5), 所以模运算的次数为O(lgb)---以b 为底数 = O(lg(2)b)---以2为底数,输入规模也可以看作是b 的bit 位数。
Openjudge-NOI题库-和数
Openjudge-NOI题库-和数题⽬描述 Description给定⼀个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。
⽐如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
输⼊输出格式 Input/output输⼊:共两⾏,第⼀⾏是数列中数的个数n ( 1 <= n <= 100),第⼆⾏是由n个不⼤于10000的正整数组成的数列,相邻两个整数之间⽤单个空格隔开。
输出:⼀个整数,即数列中等于其他两个数之和的数的个数。
输⼊输出样例 Sample input/output样例测试点#1输⼊样例:241 2 3 453 5 7 9 10输出样例:21思路:可以先将这个数组中所有两个数相加的和存⼊另⼀个数组(两重循环即可),然后再扫描⼀遍这个数组同相加的和的数组⽐较,如果相同则答案++代码如下:1 #include <stdio.h>2int main()3 {4int n,i,j;5int a;6int kk=0;7int aa[102],bb[99999];8int ans=0;9 scanf("%d",&n);10while(n>0)11 {12 scanf("%d",&a);13for(i=0;i<a;i++)14 {15 scanf("%d",&aa[i]);16 }17/*=======================*///将这个数组中的每两个数和全部存⼊bb中18for(i=0;i<a;i++)19 {20for(j=i+1;j<a;j++)21 {22 bb[kk]=aa[i]+aa[j];23 kk++;24 }25 }26/*=======================*///循环判断两个数和的数组中是否有和元素组⼀样的27for(i=0;i<kk;i++)28 {29for(j=0;j<a;j++)30 {31if(bb[i]==aa[j]) ans++;//有,ans++32 }33 }34 printf("%d\n",ans);35 ans=0;//答案归零36 kk=0;//循环变量归零37 n--;//循环条件控制38 }39return0;40 }。
openjudge练习2参考解答
private int score;
public Student(String sno, int score) {
this.sno = sno;
this.score = score;
}
public String getSno() {
this.sname = sname;
}
public String getGanbu() {
return ganbu;
}
public void setGanbu(String ganbu) {
this.ganbu = ganbu;
}
public String getXibu() {
private String sno;
private int score;
public Student(String sno, int score) {
this.sno = sno;
this.score = score;
}
public String getSno() {
return s2.getScore()-s1.getScore();
}
});
for(Student student:students){
System.out.println(student.getSno());
}
}
}
class Student{
3班级排名
方法一:Student类实现Comparable接口
import java.util.ArrayList;
import java.util.Collections;
openjudge 24 单词长度
openjudge 24 单词长度摘要:一、问题背景1.介绍OpenJudge 平台2.问题编号243.问题主题:单词长度二、问题分析1.问题描述2.问题分析3.可能的解决方案三、算法设计与实现1.暴力枚举法2.动态规划法3.Trie 树4.算法比较与优化四、代码实现1.使用暴力枚举法实现2.使用动态规划法实现3.使用Trie 树实现4.代码性能测试与分析五、总结与展望1.问题总结2.算法优缺点分析3.对未来相关问题的展望正文:一、问题背景在编程竞赛和算法练习平台上,如LeetCode、牛客网等,经常会遇到一些有趣且具有一定挑战性的算法题目。
今天我们要探讨的是来自OpenJudge 平台的第24 题:单词长度。
该问题要求我们设计一个程序,输入一个字符串,输出其中单词的最大长度。
二、问题分析对于这个问题,首先需要明确什么是单词。
在英文中,单词是由空格分隔的连续字符。
给定一个字符串,我们需要找到其中最长的单词长度。
这个问题看似简单,但实际上需要我们设计一个高效的算法来解决。
三、算法设计与实现为了解决这个问题,我们可以尝试使用以下三种算法:1.暴力枚举法:遍历字符串的每一个字符,判断当前字符是否为单词的边界。
如果当前字符是边界,则更新单词长度。
这种方法时间复杂度为O(n^2),空间复杂度为O(1),其中n 为字符串长度。
2.动态规划法:我们可以用一个数组dp 来存储以每个字符结尾的单词长度。
这样,在遍历字符串的过程中,我们可以根据dp 数组快速判断当前字符是否为单词边界,并更新dp 数组。
时间复杂度为O(n),空间复杂度为O(n),其中n 为字符串长度。
3.Trie 树:利用Trie 树存储字符串中的所有单词,并记录每个节点的子节点数量。
这样,在遍历字符串的过程中,我们可以通过查询Trie 树来获取以当前字符结尾的单词长度。
时间复杂度为O(n),空间复杂度为O(n),其中n 为字符串长度。
算法设计与分析报告基础习题参考问题详解
习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d 能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫 W—狼 G—山羊 C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.3考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=n)b.删除有序数组的第i个元素(依然有序)hints:a. Replace the ith element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element(e.g., 0 for an array of positive numbers ) to mark the ith position is empty. (“lazy deletion”)习题2.11欧几里得算法的时间复杂度欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式gcd(a, b) = gcd(b, a mod b)其中gcd(a, b)表示a 和b 的最大公约数, mod 是模运算, 即求a 除以b 的余数. 算法如下: 输入: 两个整数a, b输出: a 和b 的最大公约数function gcd(a, b:integer):integer; if b=0 return a;else return gcd(b, a mod b); end function欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth 的TAOCP 中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a 和b 的大小有怎样的关系?我们不妨设a>b>=1(若a<b 我们只需多做一次模运算, 若b=0或a=b 模运算的次数分别为0和1), 构造数列{un}: u0=a, u1=b, uk=uk-2 mod uk-1(k>=2), 显然, 若算法需要n 次模运算, 则有un=gcd(a, b), un+1=0. 我们比较数列{un}和菲波那契数列{Fn}, F0=1<=un, F1=1<=un-1, 又因为由uk mod uk+1=uk+2, 可得uk>=uk+1+uk+2, 由数学归纳法容易得到uk>=Fn-k, 于是得到a=u0>=Fn, b=u0>=Fn-1. 也就是说如果欧几里得算法需要做n 次模运算, 则b 必定不小于Fn-1. 换句话说, 若 b<Fn-1, 则算法所需模运算的次数必定小于n. 根据菲波那契数列的性质, 有Fn-1>(1.618)n/sqrt(5), 即b>(1.618)n/sqrt(5), 所以模运算的次数为O(lgb)---以b 为底数 = O(lg(2)b)---以2为底数,输入规模也可以看作是b 的bit 位数。
南京大学厦门大学ACM百练算法设计与分析OpenJudge第六章习题解答
第6章课后作业结题报告第一题:给定n种物品和一个背包,物品i(1≤i≤n)的重量是wi,其价值为vi,背包的容量为C,对每种物品只有两种选择:装入背包或者不装入背包。
如何选择装入背包的物品,使得装入背包中物品的总价值最大?这是一道老生常谈的背包问题,属于入门dp(Dynamic Programming动态规划), 首先给出状态转移方程,设dp[i][j]表示用大小为j的背包去装前i个所能获得的最大价值, w[i]表示第i个物品的体积,v[i]表示第i个物品的价值。
关于第i个物品的决策,就是间单的”取与不取”,我们很容易得到如下的状态转移方程:dp[i][j]=max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]);这边dp[i-1][j]表示第i个物品不取,dp[i-1][j-w[i]]+v[i]表示第i个物品取因为每次推导只用的到i-1维,我们其实可以只用一维的滚动数组就可以来求解。
这时候要逆序求解,这边不多做介绍接下来是打印路径问题,这个需要逆序贪心打印。
第i个背包是否选取应该用dp[i][V]与dp[i-1][V]来比较,从而求解,dp[i][V]>dp[i-1][V],V表示当前可存在的最大容量。
根据贪心,容量V越大价值同样装前i个一定更优,后面的推导的正解一定是基于dp[i][V]的,所以可以这么选标程如下:#include <stdio.h>#include <algorithm>using namespace std;int dp[110][1010];int n, c, ans[110];int w[110], v[110];void print(){int i, j, k;k=c;for(i=n; i>=1; i--){if(dp[i][k]!=dp[i-1][k]){ans[i]=1;k=k-w[i];}else{}}return;}int main(){int i, j, k;scanf("%d%d", &n, &c);for(i=1; i<=n; i++){scanf("%d%d", &w[i], &v[i]);}for(i=1; i<=n; i++){for(j=1; j<=c; j++){dp[i][j]=dp[i-1][j];if(j>=w[i]){dp[i][j]=max(dp[i-1][j-w[i]]+v[i], dp[i][j]);}}}printf("%d\n", dp[n][c]);print();for(i=1; i<=n; i++) {printf("%d\n", ans[i]);}return 0;}第二题:设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。
《算法设计与分析实用教程》习题参考解答
《算法设计与分析实用教程》习题参考解答《算法设计与分析实用教程》参考解答1-1 加减得1的数学游戏西西很喜欢数字游戏,今天他看到两个数,就想能否通过简单的加减,使最终答案等于1。
而他又比较厌烦计算,所以他还想知道最少经过多少次才能得到1。
例如,给出16,9:16-9+16-9+16-9-9-9+16-9-9=1,需要做10次加减法计算。
设计算法,输入两个不同的正整数,输出得到1的最少计算次数。
(如果无法得到1,则输出-1)。
(1)若输入两个不同的正整数a,b均为偶数,显然不可能得到1。
设x*a与y*b之差为“1”或“-1”,则对于正整数a,b经n=x+y-1次加减可得到1。
为了求n的最小值,令n从1开始递增,x在1——n中取值,y=n+1-x:检测d=x*a+y*b,若d=1或-1,则n=x+y-1为所求的最少次数。
(2)算法描述// 两数若干次加减结果为1的数学游戏#includevoid main(){long a,b,d,n,x,y;printf(" 请输入整数a,b: ");scanf("%ld,%ld",&a,&b);if(a%2==0 && b%2==0){ printf(" -1\n");return;}n=0;while(1){ n++;for(x=1;x<=n;x++){ y=n+1-x;d=x*a-y*b;if(d==1 || d==-1) // 满足加减结果为1{ printf(" n=%ld\n",n);return;}}}}请输入整数a,b: 2012,19961请输入整数a,b: 101,20136061-2 埃及分数式算法描述分母为整数分子为“1”的分数称埃及分数,试把真分数a/b 分解为若干个分母不为b 的埃及分数之和。
(1)寻找并输出小于a/b 的最大埃及分数1/c ;(2)若c>900000000,则退出;(3)若c ≤900000000,把差a/b-1/c 整理为分数a/b ,若a/b 为埃及分数,则输出后结束。
openjudge答案
openjudge答案【篇一:整理的-----acm题目及答案】a + b problem (4)1001 sum problem (5)1002 a + b problem ii (6)1005 number sequence (8)1008 elevator (9)1009 fatmouse trade (11)1021 fibonacci again (13)1089 a+b for input-output practice (i) (14)1090 a+b for input-output practice (ii) (15)1091 a+b for input-output practice (iii) (16)1092 a+b for input-output practice (iv) (17)1093 a+b for input-output practice (v) (18)1094 a+b for input-output practice (vi) (20)1095 a+b for input-output practice (vii) (21)1096 a+b for input-output practice (viii) (22)1176 免费馅饼 (23)1204 糖果大战 (25)1213 how many tables (26)2000 ascii码排序 (32)2001 计算两点间的距离 (34)2002 计算球体积 (35)2003 求绝对值 (36)2004 成绩转换 (37)2005 第几天? (38)2006 求奇数的乘积 (40)2007 平方和与立方和 (41)2008 数值统计 (42)2009 求数列的和 (43)2010 水仙花数 (44)2011 多项式求和 (46)2012 素数判定 (47)2014 青年歌手大奖赛_评委会打分 (49)2015 偶数求和 (50)2016 数据的交换输出 (52)2017 字符串统计 (54)2019 数列有序! (55)2020 绝对值排序 (56)2021 发工资咯:) (58)2033 人见人爱a+b (59)2037 今年暑假不ac (61)2039 三角形 (63)2040 亲和数 (64)2045 不容易系列之(3)—— lele的rpg难题 (65)2049 不容易系列之(4)——考新郎 (66)2056 rectangles (68)2073 无限的路 (69)2084 数塔 (71)2201 熊猫阿波的故事 (72)2212 dfs (73)2304 electrical outlets (74)2309 icpc score totalizer software (75)2317 nasty hacks (77)2401 baskets of gold coins (78)2500 做一个正气的杭电人 (79)2501 tiling_easy version (80)2502 月之数 (81)2503 a/b + c/d (82)2504 又见gcd (83)2519 新生晚会 (84)2520 我是菜鸟,我怕谁 (85)2521 反素数 (86)2522 a simple problem (88)2523 sort again (89)2524 矩形a + b (90)2535 vote (91)2537 8球胜负 (93)2539 点球大战 (95)2547 无剑无我 (98)2548 两军交锋 .............................................................. 99 2549 壮志难酬 ............................................................. 100 2550 百步穿杨 ............................................................. 101 2551 竹青遍野 ............................................................. 103 2552 三足鼎立 ............................................................. 104 2553 n皇后问题 ............................................................ 105 2554 n对数的排列问题 ...................................................... 106 2555 人人都能参加第30届校田径运动会了 .................................... 107 2560buildings ............................................................ 110 2561 第二小整数 ........................................................... 112 2562 奇偶位互换 ........................................................... 113 2563 统计问题 ............................................................. 114 2564 词组缩写 ............................................................. 115 2565 放大的x .............................................................. 117 2566 统计硬币 ............................................................. 118 2567 寻梦 ................................................................. 119 2568 前进 ................................................................. 121 2569 彼岸 (123)2700 parity ............................................................... 124 2577 how to type . (126)北京大学:1035 spell checker ........................................................ 129 1061 青蛙的约会 ........................................................... 133 1142 smith numbers ........................................................ 136 1200 crazy search ......................................................... 139 1811 primetest ........................................................... 141 2262 goldbachs conjecture ................................................ 146 2407relatives ............................................................ 150 2447rsa .................................................................. 152 2503babelfish ............................................................ 156 2513 colored sticks . (159)acm算法:kurxx最小生成树 (163)prim ....................................................................... 164 堆实现最短路 ............................................................... 166 最短路dij普通版 (167)floyd (168)bell_man ................................................................... 168 拓扑排序 ................................................................... 169 dfs强连通分支 .............................................................. 170 最大匹配 ................................................................... 172 还有两个最大匹配模板 ....................................................... 173 最大权匹配,km算法 .......................................................... 175 两种欧拉路 (177)无向图: ............................................................... 177 有向图: (178)【最大流】edmonds karp (178)dinic (179)【最小费用最大流】edmonds karp对偶算法 (181)acm题目:【题目】排球队员站位问题 (182)【题目】把自然数N分解为若干个自然数之和。
算法设计与分析-课后习题集答案
第一章3. 最大公约数为1。
快1414倍。
程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。
2()n O 。
10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。
(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。
(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。
11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
OpenJudge算法设计与分析习题解答
1、硬币面值组合描述使用1角、2角、5角硬币组成n 角钱。
设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。
输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出输出有若干行,每行的形式为:i a b c第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例输入样例输出源代码:#include<stdio.h>#include<stdlib.h>int main(){int t=1;int i,j,k;int n;scanf("%d",&n);int A=n,B=n/2,C=n/5;for(i=0;i<=C;i++){for(j=0;j<=B;j++){for(k=0;k<=A;k++){if(i*5+j*2+k*1==n){printf("%03d%12d%12d%12d\n",t,k,j,i);t++;}}}}getchar();return 0;}2、比赛排名描述5名运动员参加100米赛跑,各自对比赛结果进行了预测:A说:E是第1名。
B说:我是第2名。
C说:A肯定垫底。
D说:C肯定拿不了第1名。
E说:D应该是第1名。
比赛结束后发现,只有获第1名和第2名的选手猜对了,E不是第2名和第3名,没有出现名次并列的情况。
请编程判断5位选手各是第几名。
输入无输出输出要求:按ABCDE的顺序输出5行,其中第1行是A的名次,第2行是B的名次,第3行是C的名次,第4行是D的名次,第5行是E的名次。
样例输入样例输出源代码:#include<stdio.h>int main(){printf("5\n");printf("2\n");printf("1\n");printf("3\n");printf("4\n");return 0;}3、鸡兔同笼描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、硬币面值组合描述使用1角、2角、5角硬币组成n 角钱。
设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。
输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出输出有若干行,每行的形式为:i a b c第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例输入样例输出源代码:#include<stdio.h>#include<stdlib.h>int main(){int t=1;int i,j,k;int n;scanf("%d",&n);int A=n,B=n/2,C=n/5;for(i=0;i<=C;i++){for(j=0;j<=B;j++){for(k=0;k<=A;k++){if(i*5+j*2+k*1==n){printf("%03d%12d%12d%12d\n",t,k,j,i);t++;}}}}getchar();return 0;}2、比赛排名描述5名运动员参加100米赛跑,各自对比赛结果进行了预测:A说:E是第1名。
B说:我是第2名。
C说:A肯定垫底。
D说:C肯定拿不了第1名。
E说:D应该是第1名。
比赛结束后发现,只有获第1名和第2名的选手猜对了,E不是第2名和第3名,没有出现名次并列的情况。
请编程判断5位选手各是第几名。
输入无输出输出要求:按ABCDE的顺序输出5行,其中第1行是A的名次,第2行是B的名次,第3行是C的名次,第4行是D的名次,第5行是E的名次。
样例输入样例输出源代码:#include<stdio.h>int main(){printf("5\n");printf("2\n");printf("1\n");printf("3\n");printf("4\n");return 0;}3、鸡兔同笼描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。
已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。
输入一行,一个正整数a (a < 32768)。
输出一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。
如果没有满足要求的答案,则输出两个0,中间用一个空格分开。
样例输入样例输出源代码:#include <stdio.h>int main(){int n;scanf("%d",&n);if(n % 4== 0)printf("%d %d",n/4,n/2);else if(n % 4!= 0&&n % 2== 0)printf("%d %d",n/4 +1, n/2);elseprintf("0 0");return 0;}4、谁是你的潜在朋友描述“臭味相投”——这是我们描述朋友时喜欢用的词汇。
两个人是朋友通常意味着他们存在着许多共同的兴趣。
然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。
幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。
首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。
同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。
你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。
输入第一行两个整数N,M,2 <= N ,M<= 200。
接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)输出包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。
如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)样例输入样例输出源代码:#include <stdio.h>#include <string.h>int b[ 222 ];int a[ 222 ];int n, m;int main(){scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++ ){scanf("%d", &a[ i ]);b[ a[ i ] ]++;}for( int i = 1; i <= n; i++ ){if( b[ a[ i ] ] == 1 )printf("BeiJu\n");else if( b[ a[ i ]] >= 2 )printf("%d\n", b[ a[ i ]] - 1 );}return 0;}5、称体重描述赵、钱、孙、李四个人中既有大人也有小孩,给他们称体重时发现,他们每个人的体重都不一样,且体重(单位:公斤)恰好是10的整数倍,且他们的体重都不高于50公斤,已知赵、钱两人的体重之和恰好等于孙、李两人的体重之和;赵、李两人的体重之和大于孙、钱两人的体重之和,并且赵、孙俩人的体重之和还小于钱的体重。
请编写一个程序,按照体重从小到大的顺序,打印出四人的姓氏的首字母和体重数。
输入无输出打印出四人的姓氏的首字母(小写)和体重数(每人一行,姓名首字母和体重数之间用空格隔开)。
样例输出#include<stdio.h>#include<stdlib.h>int main(){int a[4],b[4]={1,2,3,4},c[4]={'z','q','s','l'};int i,j,t;for(a[0]=1;a[0]<=5;a[0]++){for(a[1]=1;a[1]<=5;a[1]++){for(a[2]=1;a[2]<=5;a[2]++){for(a[3]=1;a[3]<=5;a[3]++){if((a[1]!=a[0]&&a[2]!=a[1]&&a[2]!=a[0]&&a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0]) &&(a[0]+a[1]==a[2]+a[3])&&(a[0]+a[3]>a[1]+a[2])&&(a[0]+a[2]<a[1])){for(i=0;i<4;i++){b[i]=a[i];}}}}}}for(i=0;i<4;i++){a[i]=b[i];}for(i=0;i<4;i++){for(j=i+1;j<4;j++){if(b[i]>b[j]){t=b[i];b[i]=b[j];b[j]=t;}}}for(j=0;j<4;j++){for(i=0;i<4;i++){if(a[i]==b[j]){printf("%c %d\n",c[i],b[j]*10);}}}getchar();return 0;}6、比饭量描述3个人比饭量,每人说了两句话:A说:B比我吃的多,C和我吃的一样多B说:A比我吃的多,A也比C吃的多C说:我比B吃得多,B比A吃的多。
事实上,饭量和正确断言的个数是反序的关系。
请编程按饭量的大小输出3个人的顺序。
输入无输入输出按照饭量大小输出3人顺序,比如:ABC样例输入#include<stdio.h>#include<stdlib.h>int main(){int A,B,C;int a,b,c;for(A=1;A<=3;A++){for(B=1;B<=3;B++){for(C=1;C<=3;C++){a=((B>A)+(C==A));b=((A>B)+(A>C));c=((C>B)+(B>A));if( ((A>B&&a<b)||(A==B&&a==b)||(A<B&&a>b))+ ((A>C&&a<c)||(A==C&&a==c)||(A<C&&a>c))+ ((B<C&&b>c)||(B==C&&b==c)||(B>C&&b<c)) ==3){if(a>b&&a>c){if(b>c) printf("ABC");else printf("ACB");}if(b>a&&b>c){if(a>c) printf("BAC");else printf("BCA");}if(c>a&&c>b){if(a>b) printf("CAB");else printf("CBA");}}}}}getchar();return 0;}7、求排列的逆序数描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。
对于不同的排名结果可以用逆序来评价它们之间的差异。
考虑1,2,…,n的排列i1,i2,…,i n,如果其中存在j,k,满足j < k 且 i j > i k,那么就称(i j,i k)是这个排列的一个逆序。
一个排列含有逆序的个数称为这个排列的逆序数。
例如排列263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。
显然,由1,2,…,n 构成的所有n!个排列中,最小的逆序数是0,对应的排列就是1,2,…,n;最大的逆序数是n(n-1)/2,对应的排列就是n,(n-1),…,2,1。