题目 4. 百进制数 (hex.pas/c/cpp) 【问题描述】 科学进步飞快,日新月异,人们早已经不再习惯十进制那种单调的表示数字的方式。最近,Y同学投入百进制数的研究中。两个百进制数可以相邻当且仅当前一个百进制数的最后一位和后一个百进制数的第一位相同,这一位数字称之为一个交点,每一位数字最多能以起点和终点的角色属于交点一次(例如1234—3434—3412,是非法序列,因为34以起点和终点的角色充当交点各两次)。任意一个百进制数或多个可以相邻的百进制数可以形成一个合法序列。一个完美序列满足序列中所有的百进制数长度之和是所有合法序列中最大的。给出n个百进制数,我们希望将其排列才能组成最长的百进制数完美序列。 【输入格式】 第一行一个数n表示百进制数的个数; 第二行到第n-1行每行一个长度为L的百进制数。 【输出格式】 输出完美序列的长度。 【输入样例】 5 1234 347891 1291 9988 9156 【输出样例】 14 【数据范围】 20%的数据:1<=n<=10, 1<=L<=10; 80%的数据:1<=n<=50, 1<=L<=100; 100%的数据:1<=n<=100,1<=L<=100; 算法 可以搜索,深搜,或使用图论。 搜索的时候,只需要注意搜的数字串不要重复,节点不要重复,然后,百进制数一定是两位算一位的,不用枚举是一位算一位的情况。 或使用图论,以开头或结尾的两位作为节点,数字串作为边连边,然后求最长路。 注意事项 注意百进制数两位算一位的。 代码 Dfs (WYH) program hex; type integer=longint; var clist:array[0..100005] of record f,t,l:integer; end; p:array[0..105] of integer; vis,viss:array[0..105] of boolean; node:array[0..105] of record st,en,len:integer; end; n,count,ans:integer; procedure init; var i,j,l,temp:integer; s:string; begin count:=0; ans:=0; fillchar(clist,sizeof(clist),0); fillchar(p,sizeof(p),0); fillchar(vis,sizeof(vis),0); fillchar(node,sizeof(node),0); readln(n); for i:=1 to n do begin readln(s); l:=length(s); node[i].len:=l; if l<=2 then begin val(s,temp); node[i].st:=temp; node[i].en:=temp; end else begin val(copy(s,l-1,2),temp); node[i].en:=temp; if l mod 2=0 then begin val(copy(s,1,2),temp); node[i].st:=temp; end else begin val(copy(s,1,1),temp); node[i].st:=temp; end; end; end; end; procedure add(ff,tt:integer); begin inc(count); clist[count].f:=ff; clist[count].t:=tt; clist[count].l:=p[ff]; p[ff]:=count; end; procedure makepicture; var i,j:integer; begin for i:=1 to n do for j:=1 to n do if i<>j then if node[i].en=node[j].st then add(i,j); end; procedure dfs(x,long:integer); var i,j,cc,tt:integer; begin if long>ans then ans:=long; cc:=p[x]; while cc<>0 do begin tt:=clist[cc].t; if (not vis[tt]) and (not viss[node[tt].st]) then begin vis[tt]:=true; viss[node[tt].st]:=true; dfs(tt,long+node[tt].len); vis[tt]:=false; viss[node[tt].st]:=false; end; cc:=clist[cc].l; end; vis[x]:=false; end; procedure main; var i,j:integer; begin for i:=1 to n do begin fillchar(vis,sizeof(vis),0); fillchar(viss,sizeof(viss),0); vis[i]:=true; dfs(i,node[i].len); end; writeln(ans); end; begin assign(input,'hex.in');reset(input); assign(output,'hex.out');rewrite(output); init; makepicture; main; close(input); close(output); End. 图论 (LYF) var d1,d2:array[0..100] of longint; a:array[0..100,0..100] of longint; s:string; ans,l,r,len,n,i,j,k:longint; st:string; begin assign(input,'hex.in'); reset(input); assign(output,'hex.out'); rewrite(output); readln(n); for i:=1 to n do begin readln(s); len:=length(s); st:=copy(s,len-1,2); val(st,k); if odd(len) then s:='0'+s; st:=copy(s,1,2); val(st,j); if j=k then begin if len>d1[j] then begin d2[j]:=d1[j]; d1[j]:=len; end else if len>d2[j] then begin d2[j]:=len; end; continue; end; if len>a[j,k] then a[j,k]:=len; end; for i:=0 to 99 do if d2[i]<>0 then if ans<d1[i]+d2[i] then ans:=d1[i]+d2[i]; for k:=0 to 99 do for i:=0 to 99 do if (i<>k)and(a[i,k]>0) then for j:=0 to 99 do if (i<>j)and(j<>k)and(a[k,j]>0)and(a[j,k]=0) then if a[i,j]<a[i,k]+a[k,j] then a[i,j]:=a[i,k]+a[k,j]; l:=maxlongint; for i:=1 to 99 do for j:=1 to 99 do if a[i,j]>ans then begin ans:=a[i,j]; l:=i; r:=j; end; if (l<>maxlongint)and(l<>r) then writeln(d1[l]+ans+d1[r]) else writeln(ans); close(input); close(output); end.

转载于:https://www.cnblogs.com/SueMiller/archive/2011/10/15/2213688.html

解题报告 百进制数相关推荐

  1. 十进制数与其他进制数转换方法及原理

    很多人在遇到进制转换时只知道方法,不知道原理.今天,我就为大家讲解一下其方法及原理: ①十进制转其他进制的方法及原理: 举个简单的例子:十进制数13怎么转为二进制数.许多人都知道用13一直除以2,取余 ...

  2. 用栈实现将十进制数转换为任意进制数(2,8,16...).

    解题思路:假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下; N                        N/n                      N%n ...

  3. 百家姓128进制数的乘法运算

    如何进行128进制数的乘法运算呢? 在一些密码学应用的运算中,需要进行二进制1024位的大数乘法运算,二进制1024位的大数用字节表示时需要128个字节,这相当于是一个128个码的256进制数. 而采 ...

  4. 16进制数转化为bcd码的方法

    单片机设计中经常进行数制之间的转换,int类型数据可以存放65535以下的数. 转化为bcd码用以下方法: unsigned int hexresult; //待转化的16进制数: unsigned ...

  5. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  6. P1066 2^k进制数 NOIP 2006 提高组 第四题

    洛谷蓝题(点击跳转) 提高组 第四题 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的 ...

  7. 十六进制190的2进制数_十六进制数系统解释

    十六进制190的2进制数 Hexadecimal numbers, often shortened to "hex numbers" or "hex", are ...

  8. (C++)除基取余法:将十进制数转化为Q进制数

    所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...

  9. 16进制数组转成10进制 qt_计算机组成原理(进制数及转换)

    图片来源于网络 都知道计算机数据是以二进制数0和1补码的形式存储在内存中. 那你知道它们转换关系吗?那么问题来了,为什么要转换? 前面已经说过计算机数据是以二进制0和1存储,所以它们要转换为二进制存储 ...

最新文章

  1. 从我开始学单片机到完成一个智能小车的制作我都需要掌握哪些知识?
  2. 小学身高体重测试软件,学生身高、体重检测汇总分析
  3. CentOS下Storm 1.0.0集群安装详解
  4. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
  5. 实现网页定时刷新或跳转到其他页面(Refresh头字段)
  6. python字符串操作_Python 字符串操作 - 树懒学堂
  7. Latex中关于参考文献的一些经验
  8. c语言写一元一次函数图像,一元一次函数练习题带答案.doc
  9. kafka partition分配_【kafka】消费者对应的分配partition分区策略
  10. 2010年中国企业500强
  11. tp1900芯片对比7621a_MT7621A和MT7620A两个芯片,性能相差大吗?
  12. 全网首发C++ OBS源码分析与屏幕录制软件开发视频教程
  13. 公司最大的内耗,是“人才错配”
  14. windows+Texstudio+languagetool修改语法错误
  15. 四足机器人步态规划(walk and trot)
  16. 财务自由之路 读书笔记 第六章 债务
  17. 适合做引流的产品有什么特点?引流产品必须具备几个特点
  18. 什么是ActiveX控件?
  19. 用生产者消费者模式爬取斗图吧,一次性收获超多表情包【python爬虫入门进阶】(11)
  20. 安路FPGA学习之有趣的下载方式

热门文章

  1. react(94)--时间搜索传值规范
  2. React(76)--react 主题开发目录
  3. [html] HTML5的Server-Sent和WebSocket有什么区别?
  4. [css] padding会影响到元素的大小,那不想让它影响到元素的宽度应该怎么办?
  5. 前端学习(2448):发布文章功能介绍
  6. 前端学习(2239):小滴后台管理系统简介
  7. 前端学习(1834):前端面试题之从url里面输入网址
  8. 前端学习(1539):hello world
  9. 前端学习(1304):package.json
  10. 前端学习(1272):路由的基本概念和说明