当前位置:文档之家› OpenJudge算法设计与分析习题解答

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只脚,没有例外)。

已经知道了笼子里面脚的总数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。

相关主题