Categories

JPEG 压缩编码笔记

 一大清早醒来,百无聊赖间想到下学期好像是要学图像压缩的说,然后就联系到了JPEG编码,既然想到了就翻开了床头的数据通信原理,翻到编码论部分,貌似以前看这本书的时候都整整把这章给跳掉了,很是枯燥的。记得这章在图书馆翻这本书3e的时候大致浏览了遍,留有少许记忆的,不妨重新整理下做个笔记。

一、JPEG算法概要
JPEG(Joint Photographic Experts Group)是一个由ISO和IEC两个组织机构联合组成的一个专家组,负责制定静态的数字图像数据压缩编码标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,因此又称为JPEG标准。JPEG是一个适用范围很广的静态图像数据压缩标准,既可用于灰度图像又可用于彩色图像。
JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(Discrete Cosine Transform,DCT)为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法。使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。例如,在VCD和DVD-Video电视图像压缩技术中,就使用JPEG的有损压缩算法来取消空间方向上的冗余数据。为了在保证图像质量的前提下进一步提高压缩比,近年来JPEG专家组正在制定 JPEG2000标准,这个标准中将采用小波变换(Wavelet)算法。
JPEG压缩是有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。JPEG算法框图如图:

压缩编码大致分成三个步骤:
1、使用正向离散余弦变换(Forward Discrete Cosine Transform,FDCT)把空间域表示的图变换成频率域表示的图。
2、使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的。
3、使用霍夫曼可变字长编码器对量化系数进行编码。

译码或者叫做解压缩的过程与压缩编码过程正好相反。

JPEG 算法与彩色空间无关,因此“RGB到YUV变换”和“YUV到RGB变换”不包含在JPEG算法中。JPEG算法处理的彩色图像是单独的彩色分量图像,因此它可以压缩来自不同彩色空间的数据,如RGB, YCbCr和CMYK。

二、JPEG算法的主要计算步骤
JPEG压缩编码算法的主要计算步骤如下:
(1)正向离散余弦变换(FDCT)。
(2)量化(Quantization)。
(3)Z字形编码(Zigzag Scan)。
(4)使用差分脉冲编码调制(Differential Pulse Code Modulation,DPCM)对直流系数(DC)进行编码。
(5)使用行程长度编码(Run-Length Encoding,RLE)对交流系数(AC)进行编码。
(6)熵编码(Entropy Eoding)。

1、正向离散余弦变换
下面对正向离散余弦变换(FDCT)变换作几点说明。
(1)对每个单独的彩色图像分量,把整个分量图像分成若干个8×8的图像块,如图所示,并作为两维离散余弦变换DCT的输入。通过DCT变换,把能量集中在少数几个系数上。
 

(2)DCT变换使用下式计算:

它的逆变换使用下式计算:

上面两式中,
C(u),C(v) = (2)-1/2,当u, v = 0;
C(u),C(v) = 1,其他。
f(i, j)经DCT变换之后,F(0,0)是直流系数,其他为交流系数。

  (3)在计算两维的DCT变换时,可使用下面的计算式把两维的DCT变换变成一维的DCT变换:


2、量化
量化是对经过FDCT变换后的频率系数进行量化。量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。量化是图像质量下降的最主要原因。
对于有损压缩算法,JPEG算法使用如下图所示的均匀量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此图中的左上角的量化步距要比右下角的量化步距小。下面2个表中的数值对CCIR 601标准电视图像已经是最佳的。如果不使用这两种表,你也可以把自己的量化表替换它们。

亮度量化值表和色度量化值表

3、Z字形编排
量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如下图所示。这样就把一个8×8的矩阵变成一个1×64的矢量,频率较低的系数放在矢量的顶部。

量化DCT系数序号

 

0

1

5

6

14

15

27

25

2

4

7

13

16

26

29

42

3

8

12

17

25

30

41

43

9

11

18

24

31

40

44

53

10

19

23

32

39

45

52

54

20

22

33

38

46

51

55

60

21

34

37

47

50

56

59

61

35

36

48

49

57

58

62

63

4、直流系数的编码
8×8 图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码。
Delta=DC(0,0)k-DC(0,0)k-1

5、 交流系数的编码
量化AC系数的特点是1×64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。
JPEG使用了1个字节的高4位来表示连续“0”的个数,而使用它的低4位来表示编码下一个非“0”系数所需要的位数,跟在它后面的是量化AC系数的数值。

6、熵编码
使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数作进一步的压缩。
在 JPEG有损压缩算法中,使用霍夫曼编码器来减少熵。使用霍夫曼编码器的理由是可以使用很简单的查表(Lookup Table)方法进行编码。压缩数据符号时,霍夫曼编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的霍夫曼码表可以事先进行定义。

7、组成位数据流
JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据,这样做的目的是为了便于传输、存储和译码器进行译码,这样的组织的数据通常称为JPEG位数据流(JPEG bitstream)。

 

MathWork上公开的JPEG编码器代码:下载

Categories

MATLAB,上采样和内插仿真

1)
5    h1(j)=j/M;
6end
7h=[0,h1,1,fliplr(h1),0]
8% End of function file.
  生成的图形:
 

  不错,很能说明问题了,上采样的开销较大,线性内插的就好多了的说,嘻嘻,到这里结束^_^

Categories
生活

杂想

  昨天晚上开始整理搬校区是需要处理掉的书,继而是堆啊摊啊的,弄得2个桌子,发现自己的书还真的是多,装得是满满6袋,貌似2袋杂志的样子,不过很不舍得扔掉,也就等爸爸都带回来然后开始善后,该处理掉的总要处理掉,留下的再说了
  CET4弄的一点感觉也没有,算是完了,老天发慈悲的话让我过好了,不过的话也就是我自己的问题。中间还出了点岔子,手机莫名响起,关机的状态下也就闹钟会响,不过说实话我是没有关机的,一头冷汗,听力。。。
  很多时候总觉得自己一直都在逃避,逃避自己能够承担的责任。常常抱怨学院、班级的这个不好那个不行,然而旦有机会去改变时,总又是推脱其词。这是懦弱吗。。。不得而知,想想以前的自己似乎不是这样的,难道这就是成长。。。
  进入大学之前脑中的大学生活应该是无忧无虑,推开一切羁绊的。但使一进入就开始发现自己的生活和想象近乎是两码事,学业上的压力压得我喘喘窒息的样儿。连连的挂课重修,然后是重修挂课的,进而开始发现自己的学习方法根本上和大学的脱节。只要能收能伸就行,不过明摆着自己不是这样的人,开始强迫自己封闭在学校这个围城中。。。难道这就是我的大学生活。。。
  发现自己的人际关系真的处理得不怎么样,虽说大致可以把学院的人混个脸熟,不过能说上话的也就自己班里那几个人。然后开始感叹着制图彭龙老师可尽数报出学院所有人而且打成一片的架势,自叹不如的说。不过感觉还是维持现在的样子较好的,很多人真的不怎么想认识的。
  拌手细数将要离开新校区的时间,差不多也就50+的样子了,回首这差不多的2年的时间,有股漠然的感觉。应该不再是感叹时光飞逝,惋惜的时候了,从中得到些什么呢,总结会是有的。
  新的一个学年又要开始了,目标依旧是迷茫,或者说是遥远。不过我依旧会继续以远方为目标,总有一天,理想会触手可得。

Categories

加油 CET

  虽然没怎么复习,希望还是要有的哈。Just pass is ok.

Categories
.NET

一年后的回归,有点迷茫

  不知道这一年自己到底做了些什么,时常当掉的free空间,搞得兴趣全无,算算正好也是一年前在这里写了几片blog,然后转去了msn space,后面是自己的blog。发现自己的脑袋给越来越多乱七八糟的东西给杜塞,blog越弄越复杂,掩盖了真正的实质。
  离开这里的原因应该是有很多的算是,最重要的是感觉自己根本配不上这里的氛围。大家都是一心为dotNet事业奋斗的人,我这个小虾米算什么呢。经历了还多外面blog的各种富华,现在开始发现这里的纯洁和宁静。
  一年后的回归,一个新的开始,这个暑假,希望是个好的开始吧,希望,愿望,期盼

Categories
Software

SonicStage 3.4 完整版下载

刚才在sony的网站上帮朋友找本子的驱动的时候无意中发现N-S38CP/B居然有SonicStage 3.4的完整下载,hoho,本来自己也要重装系统,这下可不要等那个要命的网络版安装了,哈哈哈哈

Sony Service B2C 网站:
http://service.sony.com.cn/KB/display.asp?pageid=1&p_item=3&p_position=&id=2&p_id=1&parent_id=8290
挖出来的地址,直接下载,建议使用软件下载:
http://service.sony.com.cn/files/SOASST-01047701-UN.exe

Categories

3G 将给手机芯片带来重大机遇 终端价格下降

  计世网消息 网络网专电 据3Gtoday.com统计,截止去年12月,全球已经有166个3G网络在75个国家得到成功部署。作为3G应用的载体,终端设备环节也逐渐成为无线生态环境中最为活跃的环节,同时,3G部署也为手机芯片行业带来了众多机遇并表现出诸多发展趋势。

  3G技术演进势头强劲
  2005年,“无线互联网”是个流行词汇,目前已经广泛商用的两大3G标准技术演进的路线已越发清晰。
  在CDMA 2000标准方面,CDMA 2000 1xEV-DO版本技术已经成熟。CDMA发展组织正在积极地考虑发布EV-DO版本B标准,该标准计划于2006年第一季度发布。通过在更广泛的频段内动态分配多重射频载波,将前向链路和反向链路的数据吞吐量分别大幅度提高到惊人的73.5 Mbps和27 Mbps。
  在WCDMA方面,众多通信厂商都宣布成功地完成了HSDPA端对端呼叫。北电和高通于2005年1月26日合作,在法国成功完成了业内先驱性的商用网上基于HSDPA的端对端呼叫测试。
  2005年12月,德州仪器 (TI)也 宣布推出一款与 NTT DoCoMo 联合开发针对全球3G手机市场的多模 UMTS 芯片组样片。这款新型 OMAPV2230 解决方案属 TI OMAP-Vox架构的一部分,是一款集成的 UMTS 双模式数字基带处理器与高级应用处理器,采用 TI 高性能的 OMAP 2 架构与GSM/GPRS 技术以及 WCDMA 技术。

  芯片数据处理速度攀升
  众多芯片厂商都在积极开发处理速度更快的芯片处理器以满足无线设备对数据处理能力的要求。
  芯片的高数据处理速度为在终端中实现多媒体应用创造了硬件条件,同时也把众多先进电子设备功能融合于无线终端中。2005年11月,高通发布了专门为手机芯片打造的“Scorpion”移动微处理器,其可以提供高达1GHz的处理速度,这一指标介于我们所熟知的奔腾三和奔腾四之间。

  终端多媒体能力凸显
  音乐手机、电视手机和定位手机等基于多媒体应用的功能手机成为2005年手机行业的一个亮点。先进的空中接口为下载数据应用提供了“高速公路”,功能强大的数据处理器为终端高速运行提供了硬件技术保证。与普通PC相同,如果要实现强大的多媒体功能,软件对终端的支持也同样重要。手机芯片厂商很多都为OEM厂商提供完善的多媒体解决方案和设计参考,使得终端厂商可以最快、最大效率地推出多媒体手机终端,抢占3G终端市场。
  很多芯片厂商把先进多媒体功能作为应用“模块”植入芯片解决方案中,最大程度地提高终端多媒体能力。例如,高通的LAUNCHPAD套件为手机OEM厂商提供了整套多媒体解决方案,把集成在组件中3D游戏、定位服务、视频电话、音频等众多具有巨大市场潜力的应用集成在“引擎”化的方案中,最大程度地提升终端多媒体应用能力,并为OEM厂商缩短终端研发周期,加速了上市时间。
  而2005年12月,德州仪器推出的新型 OMAP 2 处理器使视频性能提高 4 倍,新的视频技术提高了H.264 与 Windows Media Video 9 (VC-1)的 性能,为手持终端带来消费电子设备般的高质量视觉体验。

  终端价格稳步下降
  3G终端价格将是影响3G发展的重要因素。2005年第三季度,WCDMA手机的最低价格已经下降到217美元,而在两年前的2003年,价位最低的WCDMA手机价格为412美元。一方面终端价格下降和规模经济有必然的联系,但另外一方面,众多芯片厂家都在从技术层面上降低芯片成本,以求降低终端价格,促进3G终端普及。
  除了单芯片解决方案外,众多厂商也在为业界提供CDMA2000和WCDMA的低端芯片组解决方案,用于支持新兴CDMA2000 1xEV-DO和WCDMA市场初级设备及以数据为中心的设备。

  CDMA 2000和WCDMA两个主要的3G标准正在世界范围内不断部署。更好地把握上述四大趋势应该成为众多终端芯片厂商和OEM厂商在2006年的努力方向。

Categories

Blog 功能添加

  最近把Blog移到了博客园上,顺便作了些美化,加了点功能,有一些心得,贴出来,希望对大家有帮助。

  先看看我添加功能的总体效果

<>

 

 

联系方式

QQ:29560234  点击这里给我发消息

E-mail:wym.oohoo@gmail.com

MSN:[email protected]

天气预报

访问统计


  怎么样放在侧栏的话感觉还不错吧,如果放在其他地方的话加个table自己调整一下就可以了

  下面我来一个个说明一下各个功能是如何实现的

  1、首先是时钟功能的制作,现在网络上提供时钟服务的网站还是挺多的,有些时钟确实十分的漂亮,其实实现的方法还是基本相同的,就拿我的Blog上的Clock为例。我是用的是 ClockLink 提供的时钟,ClockLink 有许多时钟,传统式的、数字式的、自定义的,还有桌面时钟。
 



 

  贴完这些钟才发现,这些钟不是同步的,哈哈 ,不过还是挺准的

  进入ClockLink 的Clock Gallery,找到你中意的时钟的样式(只是样式喔,颜色是可以改的),单击,进入该时钟的选项,你可以选择颜色,时区和时钟的大小,中国的话就选择GMT+08:00,或者直接选择CCT,还可以单击右上角的Display the City Name 来显示城市的名称,这些都十分简单,最后就是复制下窗体下方的代码。
  以第一个时钟为例

<embed src="http://www.clocklink.com/clocks/0001-Blue.swf?TimeZone=GMT" width="200" height="200" wmode="transparent" type="application/x-shockwave-flash">

  很明显这是一个Flash的时钟,TimeZone中设置了时钟的时区,width和height是时钟的长和宽。

  将代码粘贴到你想放置的网页的位置(我的所有的功能都是放在Blog的公告栏的位置的),你就有自己的时钟咯。

  2、下面是联系方式(MSN的在线状态标签我设置了半天,即使我在线,但总是显示离线,不知道为什么,不过还是把设置的方式贴出来,希望大家发现错误时候通知我

  QQ的在线状态代码可以到 腾讯互动状态代码生成页 ,选择好了喜欢的在线状态图片风格,填写好QQ/TM号码、留言的网站名称、图片旁的留言,点击,复制下生成的代码就可以了
QQ:29560234  点击这里给我发消息

<target=blank href=http://wpa.qq.com/msgrd?V=1&Uin=29560234&Site=http://laughterwym.cnblogs.com&Menu=yes><img border="0" SRC=http://wpa.qq.com/pa?p=1:29560234:1 alt="点击这里给我发消息"></a>

Site是你留言网站的网址、29560234是我的QQ号,改成你的就行了,alt是替换的文字,QQ号后的冒号后面的数字表示你选择的在线状态图片风格的代号(其是你只要在生成页生成代码就可以了)

  如果你用的Email是Gmail、MSN、Yahoo、Hotmail的话,恭喜你啦!!!你可以使用 E-Mail Icon Generator 来生成你Email的Tag,只要在 Enter your e-mail address 下面打上你的 mail 地址,选择好邮箱的后缀名,按下 Generate 一切搞定,一个漂亮的Email Tag 诞生了,其实E-Mail Icon Generator 还支持很多 mail ,包括QQ等,可以自己看看喔

  你有2种方法引用这个图标,一种是将图片保存下来,上传到自己的空间引用一下;另外一种是直接从这个网站引用。
复制下 To display this image elsewhere, use the URL: 下面红色的网址,这就是你的图片的地址(其实每次引用都是E-Mail Icon Generator 动态生成的)
E-mail:wym.oohoo@gmail.com

<href="mailto:[email protected]">
<img border="0" src="http://services.nexodyne.com/email/icon/DoUx.wNmQrU3/1mu0Wsk%3D/R01haWw%3D/0/image.png" width="164" height="21" alt="E-mail:[email protected]"></a>

这是我的连接img标签的src就是生成的URL,换成你的,再将[email protected]改成你的mail地址就行了

  再介绍一下MSN的在线状态标签的制作,可以通过 Online Status Indicator 来制作,制作方法相当方便,填写好 Messenger、User ID 按下 Get Html Code 就可以了

<HREF="http://osi.hshh.org:8088/message/msn/[email protected]">
<IMG SRC="http://osi.hshh.org:8088/msn/[email protected]"
align
="absmiddle" border="0" ALT="MSN Online Status Indicator"
onerror
="this.onerror=null;this.src='http://osi.hshh.org/msnunknown.gif';"></A>

一样将[email protected]改成你的mail地址,需要注意到的是由于安全因素,MSN初始设置是陌生人无法看见你的在线状态,若你不在意的话可以让所有人看见,设置如下:
工具=>选项=>隐私=>勾去只有位于我的“允许名单”上的人才可以查看我的在线状态或向我发消息

  3、添加天气预报

  我用的天气预报功能是贺星河大哥做的,在 Bitman 上,感觉做的十分好,用的是新浪上的天气数据,设置方法在贺星河大哥的Blog上已经描述得很清楚了,大家可以去那里看看http://www.cnblogs.com/hxhbluestar/archive/2005/08/06/209083.html

  4、网站统计设置

  在我的Blog上我设置了2个统计,一个是用来显示访问数的,还有一个是用来显示详细访问的

  访问数统计使用了 OKcounter.com 的counter,申请过程中需要注册一个网站,别的就很简单了,有很多的counter的样式供选择

<!– OKcounter Code Start –>
<script language='javascript'> ac=584271 ; lang= 'en';  view = 1</script>
<script language='javascript' src='http://okcounter.com/js/okcounter.js'></script>
<!– OKcounter Code End –>

对于不支持插入javascipt的网页,Okcounter.com也提供了代码

<!– OKcounter Code Start –>
<href=http://okcounter.com/en_status.html?id=584271> 
<img src=http://okcounter.com/count.html?id=584271 border=0></a> 
<!– OKcounter Code End –>

  另外一个统计工具是由 站长统计 提供的,功能不错,又是国内的,可以实现精确统计以下信息∶

  • 访问量,包括网站的独立访客数(IP)及页面访问量(Pageview)
  • 访问时段,即一天 24 小时内的访问量的分布
  • 访问者来自地区,对国内访问的分析可以精确到省
  • 来自搜索引擎的访问,可以统计出搜索引擎种类及关键字分布
  • 客户访问时所使用的浏览器及操作系统
  • 客户访问时所使用的分辨率
  • 访问来源,可以统计出来自其他网站的链接所导入的访问量
  • 页面热点统计,可以统计出网站上最受欢迎的页面的排名
  • 同时在线统计,可以统计出 20 分钟网站上的同时在线人数
  • 保留一天的访问统计详细记录

  申请也十分方便,中文的应该大家没什么问题,不再赘述

  写了那么多好累啊,希望对大家有点帮助,好看的Blog给浏览者也是种享受吧。

Categories
开发

TopCoder(R) Single Round Match 257

本来想试试昨天的TopCoder(R) Single Round 的的,起得太晚了,没赶上Registration ,哎~~~可惜。。。
贴上题目做做吧
 


 

SubstitutionCode  Point 250
 Division Two – Level One

 

Problem Statement for SubstitutionCode

Problem Statement

     A simple, easy to remember system for encoding integer amounts can be very useful. For example, dealers at flea markets put the information about an item on a card that they let potential buyers see. They find it advantageous to encode the amount they originally paid for the item on the card.

A good system is to use a substitution code, in which each digit is encoded by a letter. An easy to remember 10-letter word or phrase, the key, is chosen. Every '1' in the value is replaced by the first letter of the key, every '2' is replaced by the second letter of the key, and so on. Every '0' is replaced by the last letter of the key. Letters that do not appear in the key can be inserted anywhere without affecting the value represented by the code.. This helps to make the resulting code much harder to break (without knowing the key).

Create a class SubstitutionCode that contains the method getValue that is given the Strings key and code as input and that returns the decoded value.

 

Definition

    
Class: SubstitutionCode
Method: getValue
Parameters: String, String
Returns: int
Method signature: int getValue(String key, String code)
(be sure your method is public)
    
 
 

Constraints

code contains between 1 and 9 characters inclusive, all uppercase letters 'A'-'Z'
code contains at least one letter that is found in key
key contains exactly 10 uppercase letters 'A'-'Z', all distinct from each other
 

Examples

0)  
    
"TRADINGFEW"
"LGXWEV"
Returns: 709
The L,X, and V are ignored since they do not appear in the key. G is the seventh letter in the key, W is the 10th letter, and E is the 9th letter.
1)  
    
"ABCDEFGHIJ"
"XJ"
Returns: 0
 
2)  
    
"CRYSTALBUM"
"MMA"
Returns: 6
 

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2005, TopCoder, Inc. All rights reserved.

 

 


 

BridgePts  Point 500
 Division Two – Level Two

 

Problem Statement for BridgePts

Problem Statement

     A deck of cards contains 52 cards. Each card has a suit (Clubs,Diamonds,Hearts,Spades) and a value (Ace,2,3,…,9,10,Jack,Queen,King). In the game of bridge a hand consists of 13 cards from the deck.

A player needs to evaluate his hand, giving it a point value. The standard method is as follows: count 4 points for each Ace, 3 points for each King, 2 points for each Queen, and 1 point for each Jack. For each suit, count 1 point if the hand contains exactly two cards of that suit, 2 points if exactly one card, and 3 points if the hand contains no cards of that suit. The point value of the hand is the sum of all these points.

Create a class BridgePts that contains a method pointValue that is given a int[] hand and that returns the point value of the hand.

Each element of hand indicates a card. The clubs are numbered 1 to 13, the diamonds are 14 to 26, the hearts are numbered 27 to 39, and the spades are numbered 40 to 52. Within each suit, the cards are numbered in the order Ace, 2, 3, …, 9, 10, Jack, Queen, King. So, for example, the King of Hearts is numbered 39 and the Ace of Spades is numbered 40.

 

Definition

    
Class: BridgePts
Method: pointValue
Parameters: int[]
Returns: int
Method signature: int pointValue(int[] hand)
(be sure your method is public)
    
 
 

Constraints

hand will contain exactly 13 elements, all distinct.
Each element of hand will have a value between 1 and 52 inclusive.
 

Examples

0)  
    
{25,14,15,16,17,18,19,20,21,22,23,24,26}
Returns: 19
This hand contains all diamonds, so it has one Ace, one King, one Queeen, and one Jack, and it contains no cards in three suits. So its point value is 4 + 3 + 2 + 1 + 3 + 3 + 3 = 19.
1)  
    
{2,3,4,15,18,28,29,30,41,42,43,16,17}
Returns: 0
This hand contains only 2's, 3's, 4's and one 5. It has 3 or 4 cards in each suit.

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2005, TopCoder, Inc. All rights reserved.

 

 


 

TimeCard  Point 1000
 Division Two – Level Three

 

Problem Statement for TimeCard

Problem Statement

     When I start my shift at work I punch in my starting time, and when I leave I punch out. The times are printed on a card using exactly 8 characters in the format

           hh:mm,xx 

where hh is the 2 digit representation of the hour, mm is the 2 digit representation of the minute, and xx is either am or pm. The ':' and ',' are literal. "12:00,am" denotes midnight, while "12:00,pm" denotes noon.

The difference between that time I punch in and the time I punch out is the amount of time I have worked so, for example, if I punch in at 03:33pm and punch out at 03:34pm I have worked 1 minute.

No shift is allowed to be more than 20 hours long. This is my last shift of the week and I am supposed to work 40 hours during the week. Create a class TimeCard that contains a method leave that is given a String[] time of all the times on this week's timecard and that returns a String (using the same format) that tells when I can leave and have exactly 40 hours for the week. Return "BELOW 40" or "ABOVE 40" if it is not possible to get exactly 40 hours. In all cases, the return should contain exactly 8 characters.

The elements of time alternate: punch in time, punch out time, punch in time, … with the final element being the time I just punched in on my final shift.

 

Definition

    
Class: TimeCard
Method: leave
Parameters: String[]
Returns: String
Method signature: String leave(String[] time)
(be sure your method is public)
    
 
 

Constraints

time will contain an odd number of elements between 1 and 49 inclusive.
Each element of time will be formatted as above.
In each element of time hh will be between 01 and 12 inclusive.
In each element of time mm will be between 00 and 59 inclusive.
time will contain no shift that exceeds 20 hours in duration.
 

Examples

0)  
    
{"03:00,pm"}
Returns: "BELOW 40"
This is my one and only shift, and I am only allowed to work 20 hours on a shift.
1)  
    
{"09:00,am","05:00,pm","09:00,am","05:00,pm",
    "09:00,am","05:00,pm","09:00,am","05:00,pm","09:00,am"}
Returns: "05:00,pm"
I have worked 4 previous shifts of 8 hours, so I need 8 hours on this shift to make 40.
2)  
    
{"12:00,am","08:00,pm","12:00,am","08:00,pm","12:00,am"}
Returns: "12:00,am"
I have already worked 2 shifts of 20 hours so I already have exactly 40 hours. I should go home immediately.
3)  
    
{"12:00,pm","08:00,pm","12:00,am","08:00,pm","12:00,am"}
Returns: "12:00,pm"
 
4)  
    
{"09:00,am","04:31,pm","09:00,am","04:31,pm",
     "09:00,am","05:00,pm","09:00,am","05:00,pm","03:53,am"}
Returns: "12:51,pm"
 

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2005, TopCoder, Inc. All rights reserved.

Categories
开发

Practise – Inv 2001 R1 Point 250

Problem Statement

    
***Note:  Please keep programs under 7000 characters in length.  Thank you


Class Name: HowEasy
Method Name: pointVal
Parameters: String
Returns: int
 
TopCoder has decided to automate the process of assigning problem difficulty
levels to problems.  TopCoder developers have concluded that problem difficulty
is related only to the Average Word Length of Words in the problem statement:

If the Average Word Length is less than or equal to 3,  the problem is a 250
point problem.