首页 OpenJudge算法设计与分析习题解答

OpenJudge算法设计与分析习题解答

举报
开通vip

OpenJudge算法设计与分析习题解答1、硬币面值组合描述使用1角、2角、5角硬币组成n角钱。设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a,b,c组合。输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。输入一个整数n(1#includeintmain(){intt=1;inti,j,k;intn;scanf("%d",&n);intA=n,B=n/2,C=n/5;for(i=0;iintmain(){printf("5\n");printf("2\n");printf("1\n");printf("3\n");printf("...

OpenJudge算法设计与分析习题解答
1、硬币面值组合描述使用1角、2角、5角硬币组成n角钱。设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a,b,c组合。输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。输入一个整数n(1<=n<=100),代表需要组成的钱的角数。输出输出有若干行,每行的形式为:iabc第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a,b,c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。样例输入10样例输出0011000002810003620004430005240006050007501008311009121010002源代码:#include#includeintmain(){intt=1;inti,j,k;intn;scanf("%d",&n);intA=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();return0;}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的名次。样例输入样例输出源代码:#includeintmain(){printf("5\n");printf("2\n");printf("1\n");printf("3\n");printf("4\n");return0;}3、鸡兔同笼描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。输入一行,一个正整数a(a<32768)。输出一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。如果没有满足要求的答案,则输出两个0,中间用一个空格分开。样例输入20样例输出510源代码:#includeintmain(){intn;scanf("%d",&n);if(n%4==0)printf("%d%d",n/4,n/2);elseif(n%4!=0&&n%2==0)printf("%d%d",n/4+1,n/2);elseprintf("00");return0;}4、谁是你的潜在朋友描述“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。首先你对借阅记录进行了一番整理,把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”(即悲剧,^^)样例输入452321样例输出1BeiJu1BeiJu源代码:#include#includeintb[222];inta[222];intn,m;intmain(){scanf("%d%d",&n,&m);for(inti=1;i<=n;i++){scanf("%d",&a[i]);b[a[i]]++;}for(inti=1;i<=n;i++){if(b[a[i]]==1)printf("BeiJu\n");elseif(b[a[i]]>=2)printf("%d\n",b[a[i]]-1);}return0;}5、称体重描述、钱、、四个人中既有大人也有小孩,给他们称体重时发现,他们每个人的体重都不一样,且体重(单位:公斤)恰好是10的整数倍,且他们的体重都不高于50公斤,已知、钱两人的体重之和恰好等于、两人的体重之和;、两人的体重之和大于、钱两人的体重之和,并且、俩人的体重之和还小于钱的体重。请编写一个程序,按照体重从小到大的顺序,打印出四人的姓氏的首字母和体重数。输入无输出打印出四人的姓氏的首字母(小写)和体重数(每人一行,首字母和体重数之间用空格隔开)。样例输入无样例输出z10q20s30l40(以上输出仅用于说明格式)#include#includeintmain(){inta[4],b[4]={1,2,3,4},c[4]={'z','q','s','l'};inti,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]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();return0;}6、比饭量描述3个人比饭量,每人说了两句话: A说:B比我吃的多,C和我吃的一样多 B说:A比我吃的多,A也比C吃的多 C说:我比B吃得多,B比A吃的多。 事实上,饭量和正确断言的个数是反序的关系。 请编程按饭量的大小输出3个人的顺序。输入无输入输出按照饭量大小输出3人顺序,比如:ABC样例输入无样例输出无#include#includeintmain(){intA,B,C;inta,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&&ab))+((A>C&&ac))+((Bc)||(B==C&&b==c)||(B>C&&bb&&a>c){if(b>c)printf("ABC");elseprintf("ACB");}if(b>a&&b>c){if(a>c)printf("BAC");elseprintf("BCA");}if(c>a&&c>b){if(a>b)printf("CAB");elseprintf("CBA");}}}}}getchar();return0;}7、求排列的逆序数描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。对于不同的排名结果可以用逆序来 评价 LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载 它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足jik,那么就称(ij,ik)是这个排列的一个逆序。一个排列含有逆序的个数称为这个排列的逆序数。例如排列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。逆序数越大的排列与原始排列的差异度就越大。现给定1,2,…,n的一个排列,求它的逆序数。输入第一行是一个整数n,表示该排列有n个数(n<=100000)。第二行是n个不同的正整数,之间以空格隔开,表示该排列。输出输出该排列的逆序数。样例输入6263451样例输出8提示1.利用二分归并排序算法(分治);2.注意结果可能超过int的围,需要用longlong存储。#includeusingnamespacestd;constintMAX_NUM=100000+5;longlongseq[MAX_NUM];intN;longlongans;voidreSeq(longlong*seq,intlef,intrigh){//用longlong存储,避免结果超过int的围if(lef>=righ){return;}intmid=lef+(righ-lef)/2;reSeq(seq,lef,mid);reSeq(seq,mid+1,righ);inttotalSize=righ-lef+1;longlongtmp[totalSize];intn=lef;intm=mid+1;inti=0;while(n<=mid||m<=righ){if(m>righ||(n<=mid&&seq[n]<=seq[m])){tmp[i++]=seq[n++];}else{tmp[i++]=seq[m++];ans+=mid-n+1;}}i=lef;for(intj=0;j 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 分治算法对任意的n值构造相应的Grey码。输入每个元素的长度值n。输出将所有相应的Grey码分行输出,即每一行输出一个二进制位串。样例输入3样例输出000001011010110111101100源代码:#include#includeintpower(intbase,intn){inti,p=1;for(i=1;i<=n;++i)p=p*base;returnp;}voidGrey(inta,intb,int**arr,intk){if(b==1){*((int*)arr+k*0+0)=0;//arr[0][0]=0;*((int*)arr+k*1+0)=1;//arr[1][0]=1;return;}else{for(inti=0;i=0;j--){printf("%d",arr[i][j]);}printf("\n");}getchar();return0;}9、循环比赛描述设有N个选手的循环比赛。其中N=2^M(2的M次方),要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。输入M输出表格形式的比赛安排表样例输入3样例输出1234567821436587341278564321876556781234658721437856341287654321提示M的大小不会超过8源代码:#include#includevoidarrange(intk,int**a,intn){intt=1,temp=1;*((int*)a+k*0+0)=1;//a[0][0]=1;while(t<=n){for(inti=0;i 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 描述在一个2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘。显然,特殊方格在棋盘中出现的位置有4k种情形,因而有4k种不同的棋盘,如图1所示是k=2时16种棋盘中的一个。在棋盘覆盖问题中,要求用图2所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何两个L型骨牌不得重叠覆盖。输入对每一个测试例有2行,第一行是k(1<=k<=10),第二行是特殊方格所在的位置坐标x,y(0<=x,y<1024)。输出边长为2的k次方的方阵,特殊方格的编号为0,所有L型骨牌从1开始编号,数据之间的间隔是空格。样例输入201样例输出2033221341154455提示按分治策略进行算法设计。#include#includeintt=0;intboard[100][100];voidChessBoard(inttr,inttc,intdr,intdc,intsize){ints,t1;if(size==1)return;t1=++t;s=size/2;if(dr=tc+s){ChessBoard(tr,tc+s,dr,dc,s);}else{board[tr+s-1][tc+s]=t1;ChessBoard(tr,tc+s,tr+s-1,tc+s,s);}if(dr>=tr+s&&dc=tr+s&&dc>=tc+s){ChessBoard(tr+s,tc+s,dr,dc,s);}else{board[tr+s][tc+s]=t1;ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}}intmain(){intn,size=1;scanf("%d",&n);for(inti=0;i#include#includeusingnamespacestd;structnode{intx,y;}num[200000];boolcmp(nodea,nodeb){returna.y#includeusingnamespacestd;intdp[110][1010];intn,c,ans[110];intw[110],v[110];voidprint(){inti,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;}intmain(){inti,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]);}return0;}13、最少硬币问题描述设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,计算找钱m的最少硬币数。输入由文件提供输入数据,文件的第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1行是要找的钱数m。输出将计算出的最少硬币数输出到文件中。问题无解时输出-1。样例输入313235318样例输出5提示运用动态规划法进行算法设计并编程实现。源代码:#include#includeusingnamespacestd;intw[110],v[110];intdp[110][20010];intn,m;voidinit(){for(inti=0;i<110;i++){for(intj=0;j<20010;j++){dp[i][j]=2000000000;}}}intmain(){inti,j,k;intt,x,t=1;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d",&t,&x);for(j=1;j<=x;j++){w[cnt]=t;v[cnt]=1;cnt++;}}scanf("%d",&m);init();for(i=0;i=w[i]&&dp[i-1][j-w[i]]!=2000000000){dp[i][j]=min(dp[i][j],dp[i-1][j-w[i]]+1);}}}if(dp[cnt-1][m]==2000000000)printf("-1");elseprintf("%d",dp[cnt-1][m]);return0;}14、矩阵连乘描述给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。矩阵连乘积的计算次序与其计算量有密切关系。例如,考察计算3个矩阵{A1,A2,A3}连乘积的例子。设这3个矩阵的维数分别为10*100,100*5,和5*50。若按(A1A2)A3计算,3个矩阵连乘积需要的数乘次数为10*100*5+10*5*50=7500。若按A1(A2A3)计算,则总共需要100*5*50+10*100*50=75000次数乘。现在你的任务是对于一个确定的矩阵连乘 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,计算其需要的数乘次数。输入输入数据由多组数据组成。每组数据格式如下:第一行是一个整数n(1≤n≤26),表示矩阵的个数。接下来n行,每行有一个大写字母,表示矩阵的名字,后面有两个整数a,b,分别表示该矩阵的行数和列数,其中1#include#include#include#include#includeusingnamespacestd;intn,ans;stringexp,str;intx,y;structnode{intx,y;};nodes[200];intflage;stackope;stackv;stringchange(stringt){intlength=t.length();stringdes="";for(inti=0;i';}}}intmain(){inti,j,k;stringe;while(cin>>n){for(i=1;i<=n;i++){cin>>str>>x>>y;s[str[0]].x=x;s[str[0]].y=y;}cin>>e;flage=0;ans=0;exp=change(e);while(!ope.empty()){ope.pop();}while(!v.empty()){v.pop();}ope.push('=');intl=exp.length();for(k=0;k<=l-1;){if(isalpha(exp[k])){v.push(s[exp[k]]);k++;}else{if(compare(ope.top(),exp[k])=='='){ope.pop();k++;}elseif(compare(ope.top(),exp[k])=='<'){ope.push(exp[k]);k++;}else{nodea=v.top();v.pop();nodeb=v.top();v.pop();v.push(calc(b,a));ope.pop();}}}if(!flage)cout<#include#include#includeusingnamespacestd;typedeflonglongintll;constllinf=000;intn;strings;charop[110][110];lldp[110][110],dpmin[110][110];lla[110];llcalc(lla,llb,charch){if(ch=='*'){returna*b;}elseif(ch=='+'){returna+b;}else{return0;}}intmain(){inti,j,k,t;cin>>n;for(i=1;i<=n;i++){cin>>t;a[i]=t;cin>>s;op[i][i+1]=s[0];}for(i=n+1;i<=2*n;i++){a[i]=a[i-n];}//for(i=1;i<=2*n;i++){//printf("%d",a[i]);//}//printf("\n");for(i=n+1;i<2*n;i++){op[i][i+1]=op[i-n][i+1-n];}//for(i=1;i<2*n;i++){//printf("%c",op[i][i+1]);//}//printf("\n");for(i=1;i<=2*n;i++){//初始化为最小值for(j=i;j<=2*n;j++){dp[i][j]=-inf;dpmin[i][j]=inf;}}for(i=1;i<=2*n;i++){dp[i][i]=a[i];dpmin[i][i]=a[i];}for(i=1;i<2*n;i++){dp[i][i+1]=calc(a[i],a[i+1],op[i][i+1]);dpmin[i][i+1]=calc(a[i],a[i+1],op[i][i+1]);}for(i=3;i<=n;i++){for(j=1;j+i-1<=2*n;j++){for(k=j;kans){ans=dp[i][i+n-1];}}cout<#includeusingnamespacestd;intmain(){intn;inta[100];scanf("%d",&n);intsum=0;inttemp=0;for(inti=0;i
本文档为【OpenJudge算法设计与分析习题解答】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
is_529050
暂无简介~
格式:doc
大小:49KB
软件:Word
页数:44
分类:
上传时间:2021-12-18
浏览量:0