【Topcoder】SRM157 DIV2总结
250分题:简单的二分,就是平常玩的猜数字游戏
代码:GitHub
500分题:给出一个员工一天的打卡时间段,要求求出员工这一天的工资。其中正常上班时间是6:00:00到18:00:00,薪水是wage,其他时间薪水是1.5*wage。
我的思路比较直接,将时间分成三个时间段分别计算:00:00~06:00,06:00~18:00,18:00~23:59:59。伪码如下:
if(arrival time < 06:00:00)
money += 1.5*wage*(min(06:00:00,departure time)-arrival time);
if(departure time > 06:00:00)
arrival time = 06:00:00; if(arrival time >= 06:00:00 && arrival time <18:00:00)
money += wage*(min(departure time,18:00:00) - 06:00:00);
if(departure time > 18:00:00)
arrival time = 18:00:00; if(arrival time >= 18:00:00)
money += 1.5*wage*(departure time - arrival time);
具体实现的时候,我直接用了java的date类,算时间差的时候就很麻烦,其实只要把所有时间都转换成秒,然后计算这个人每秒赚多少钱,这样无论是比较时间的大小还是计算两个时间点的差值都非常容易。所以积累一点,以后遇到要比较时间大小和差值的,尽量转换成秒来计算,会省去很多麻烦。不过今天做了半天,积累了一些关于java的date类的知识,积累如下:
1.讲形如“HH:mm:ss”的字符串转换为Date型:
SimpleDateFormat fommater = new SimpleDateFormat("HH:mm:ss");
Date arriDate = fommater.parse(arrival);
上述的parse函数可能会抛出ParseException异常,需要处理。
2.判断时间t1是否在时间t2的前面或者后面:
t1.before(t2);
t1.after(t2);
3.求时刻t1和t2的差值(单位是毫秒)
long bewteen = t1.getTime() - t2.getTime();
最后完整的代码:GitHub
这道题官方还给了一个很简便的解法:把arrival time和departure time都变成秒为单位后,直接从arrival time一秒一秒的遍历到departure time,如果当前的一秒在正常上班范围内,增加计数器t1;如果在加班的范围内,增加计数器t2,最后得到的钱就是wage*t1+1.5*wage*t2(wage是每秒赚的钱)。这个方法比上面分三段判断实现起来要简单很多。
1000分题:给出两个沙漏,一个可以用来衡量出时间glass1,一个可以用来衡量出glass2,要求求出前十个最小的能够衡量出的时间。
第一眼看没思路,看了解答才发现要用递归+备忘录的方法:递归函数helper定义为void helper(int sand1,int sand2,int time)表示在时刻time,两个沙漏分别能够衡量出时间sand1和sand2,此时有两种可能
1.sand1或者sand2至少一个漏空了,那么我们有四种选择:
(1)把sand1倒过来,sand2不动,递归调用helper(glass1-sand1,sand2,time);
(2)把sand2倒过来,sand1不动,递归调用helper(sand1,glass2-sand2,time);
(3)把sand1和sand2全部倒过来,递归调用helper(glass1-sand1,glass2-sand2,time);
(4)sand1和sand2都不动,等待没空的那个漏空,此时需要看两个沙漏哪个还没漏完,假设1还没漏完,就递归调用helper(0,0,time+sand1);
2.sand1和sand2都没有漏空,那么我们必须要等待他们中有较少的沙的沙漏漏完才能有动作,此时递归调用helper(sand1-min(sand1,sand2),sand2-min(sand1,sand2),time+min(sand1,sand2)。
如果单纯的递归会超时,因为对于同一组(sand1,sand2,time),在递归的过程中,我们可能会多次重复调用,所以要用备忘录visited[][][]记录我们掉用过哪些sand1,sand2,time,避免重复的调用。
最后代码:GitHub
【Topcoder】SRM157 DIV2总结的更多相关文章
- topcoder 594 DIV2 foxandclassroom
暴力枚举 1 #include <iostream> #include <vector> #include <string> using namespace std ...
- topcoder 643 DIV2
太弱了,太弱了! A:基本的判断吧,然后就是边界问题,写了好久,结果发现时房间第二个交的.. B:真心跪了,还好想出来了,思路想的太慢太慢,结果交上去,落后太多,不过HACK时很多人挂了, 这也是DI ...
- ACM学习历程—TopCoder SRM691 Div2
这是我的第一次打TC,感觉打的一般般吧.不过TC的题目确实挺有意思的. 由于是用客户端打的,所以就不发题目地址了. 300分的题: 这题大意是有一段序列只包含+和数字0~9. 一段序列的操作是,从头扫 ...
- TopCoder SRM596 DIV2 1000: SparseFactorialDiv2
题意: For an integer n, let F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2), wh ...
- topcoder 649 DIV2
8 A:模拟 9:B:终于看懂题目... 题意:最多分解K次 每分钟一个数可以分解成两个数 或者-1: 关键字:DP,记忆花搜索. DP[I][J]=min(dp[i][j],1+max(dp[ii] ...
- Topcoder 658 650 point
Topcoder 658 div2 500 加强版 不过给了<=20,暴力肯定不行. 然后想DP方程,先二分可能需要的最大次数mid; 然后根据 mid 构造 DP方程. 假设x[i]需要 x个 ...
- Topcoder Srm 673 Div2 1000 BearPermutations2
\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
随机推荐
- [Android]ListView & ViewPager & GridView 常见问题解决方法
1. ViewPager左右滚动到两边时的渐变色,若想禁止,可以在布局文件中配置:android:overScrollMode="never" 2. ListView,GridVi ...
- 为什么Servlet修改之后,Tomcat都得重启,servlet才会生效!
最近做东西经常需要重新加载项目,今天深深的问了自己为什么? Servlet的生命周期中,只会初始化一次,如果每次要是发送请求或响应,Servlet引擎都会调用service.从这里就会看出,servl ...
- golang解析json
解析json,在很多语言都是很常用的,go提供了相应的包"encoding/json"来处理.直接上代码,如下: package main import ( "encod ...
- PHP : ActiveRecord实现示例
先简单介绍一下Active Record: Active Record(中文名:活动记录)是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录.Acti ...
- 关于OCR,一些想法
OCR一般分为两种: 1,根据给定的字符特征集合,提取未知字符的特征进行匹配识别:(典型例子:GOCR) 2,不知道字符特征,但给出提取特征的规则,通过机器学习training来获取某个字符集的特征集 ...
- OpenCV学习笔记四:ImgProc模块
一,简介 这个模块包含一系列的常用图像处理算法. 二,分析 此模块包含的文件如下图: 其导出算法包括如下: /*********************** Background statistics ...
- [Unity基础]移动平台下的文件读写
From:http://blog.csdn.net/lyh916/article/details/52161633 参考链接: http://www.cnblogs.com/murongxiaopif ...
- JDK的命令具体解释操作
JDK的命令具体解释1 rmic 功能说明: rmic 为远程对象生成 stub 和 skeleton. 语法: rmic [ options ] package-qualified-class-na ...
- 不在要DLL中使用C++全局对象
如题,原因很简单,DLL不会调用该对象的析构函数. 果断被微软坑了.
- Android Studio中debug和release模式默认的参数配置
The possible properties and their default values are: debuggable:表示是否可以在手机上调试程序. 在Eclipse中,只有android ...