hdu1260 Tickets(DP)
2016-05-28 14:25
330 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1260
Total Submission(s): 2897 Accepted Submission(s): 1413
[align=left]Problem Description[/align]
Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this is really a tuff time for Joe who sells the film tickets. He is wandering when could he go back home as early as possible.
A good approach, reducing the total time of tickets selling, is let adjacent people buy tickets together. As the restriction of the Ticket Seller Machine, Joe can sell a single ticket or two adjacent tickets at a time.
Since you are the great JESUS, you know exactly how much time needed for every person to buy a single ticket or two tickets for him/her. Could you so kind to tell poor Joe at what time could he go back home as early as possible? If so, I guess Joe would full
of appreciation for your help.
[align=left]Input[/align]
There are N(1<=N<=10) different scenarios, each scenario consists of 3 lines:
1) An integer K(1<=K<=2000) representing the total number of people;
2) K integer numbers(0s<=Si<=25s) representing the time consumed to buy a ticket for each person;
3) (K-1) integer numbers(0s<=Di<=50s) representing the time needed for two adjacent people to buy two tickets together.
[align=left]Output[/align]
For every scenario, please tell Joe at what time could he go back home as early as possible. Every day Joe started his work at 08:00:00 am. The format of time is HH:MM:SS am|pm.
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Source[/align]
浙江工业大学第四届大学生程序设计竞赛
题意:求售票员把票卖给K个人所需的最短时间,票有2种方式售卖,一种是单独卖给一个顾客,另一种就是卖给相邻的两个顾客(_(:з」∠)_看到这里就觉得是dp了)
解题思路:首先,票有2种方式售卖,就猜想有2个转移方程。这时我们先设dp[i]为卖给前i个人(包含第i个人)的最短时间,很明显有2种状态可以转移到这个状态上。
①第i个人单独购买票。即dp[i-1] + s[i] ; (s[i]为第i个人单独购票所需的时间)
②第i和i-1一起买票。 即dp[i-2] +d[i-1] ;(d[i]第i和第i-1一起买票所需的时间)
所以我们就可以很简单得出方程 dp[i] = min { dp[i-1] + s[i] , dp[i -2] +d[i-1]}
AC代码如下:
http://acm.hdu.edu.cn/showproblem.php?pid=1260
Tickets
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2897 Accepted Submission(s): 1413
[align=left]Problem Description[/align]
Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this is really a tuff time for Joe who sells the film tickets. He is wandering when could he go back home as early as possible.
A good approach, reducing the total time of tickets selling, is let adjacent people buy tickets together. As the restriction of the Ticket Seller Machine, Joe can sell a single ticket or two adjacent tickets at a time.
Since you are the great JESUS, you know exactly how much time needed for every person to buy a single ticket or two tickets for him/her. Could you so kind to tell poor Joe at what time could he go back home as early as possible? If so, I guess Joe would full
of appreciation for your help.
[align=left]Input[/align]
There are N(1<=N<=10) different scenarios, each scenario consists of 3 lines:
1) An integer K(1<=K<=2000) representing the total number of people;
2) K integer numbers(0s<=Si<=25s) representing the time consumed to buy a ticket for each person;
3) (K-1) integer numbers(0s<=Di<=50s) representing the time needed for two adjacent people to buy two tickets together.
[align=left]Output[/align]
For every scenario, please tell Joe at what time could he go back home as early as possible. Every day Joe started his work at 08:00:00 am. The format of time is HH:MM:SS am|pm.
[align=left]Sample Input[/align]
2 2 20 25 40 1 8
[align=left]Sample Output[/align]
08:00:40 am 08:00:08 am
[align=left]Source[/align]
浙江工业大学第四届大学生程序设计竞赛
题意:求售票员把票卖给K个人所需的最短时间,票有2种方式售卖,一种是单独卖给一个顾客,另一种就是卖给相邻的两个顾客(_(:з」∠)_看到这里就觉得是dp了)
解题思路:首先,票有2种方式售卖,就猜想有2个转移方程。这时我们先设dp[i]为卖给前i个人(包含第i个人)的最短时间,很明显有2种状态可以转移到这个状态上。
①第i个人单独购买票。即dp[i-1] + s[i] ; (s[i]为第i个人单独购票所需的时间)
②第i和i-1一起买票。 即dp[i-2] +d[i-1] ;(d[i]第i和第i-1一起买票所需的时间)
所以我们就可以很简单得出方程 dp[i] = min { dp[i-1] + s[i] , dp[i -2] +d[i-1]}
AC代码如下:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<set> #include<cmath> #include<vector> #include<map> using namespace std; typedef long long ll; const int maxn = 2050; const int INF = 1e+9; int d[maxn]; int s[maxn]; int dp[maxn]; char str[][10]={"pm","am"}; int main() { int n; cin >> n ; while(n--) { int k1 ; scanf("%d",&k1); for(int i = 1 ; i <= k1 ; i ++) scanf("%d",&s[i]); int k2 = k1-1; for(int i = 1 ; i <= k2 ; i ++) scanf("%d",&d[i]); dp[0] = 0; for(int i = 1; i <= k1; i ++) dp[i] = INF; for(int i = 1 ; i <= k1; i ++) { dp[i] = min(dp[i],dp[i-1]+s[i]); if(i>=2) dp[i] =min(dp[i],dp[i-2]+d[i-1]); } int cnt1 = dp[k1]/3600; int cnt2 = (dp[k1]-cnt1*3600)/60; int cnt3 = dp[k1]%60; int HH,MM,SS,flag=1; HH = 8+cnt1 ; MM = cnt2; SS = cnt3; if(HH>=12) { HH-=12; flag = 0; } printf("%02d:%02d:%02d %s\n",HH,MM,SS,str[flag]); } return 0 ; }
相关文章推荐
- 《移动端浏览器Touch事件判断手指滑动方向方法》
- 正则表达式
- 每天刷个算法题20160524:阿克曼函数的递归转非递归解法
- 图标网站--很牛X
- 记一次非常颓非常浪的模拟赛——2016.5.28
- Linux中常用的查询指令(which、whereis、find、locatae)
- I/O多路转接之select——基于TCP协议
- nginx 编译安装时提示md5.h不存在
- PHP中$_SERVER[HTTP_REFERER]
- window环境下为git配置多个SSH密钥
- android service与子线程之浅谈
- PhoneGap android开发:多媒体API
- 对象作为方法的参数连续的传递
- Hadoop环境配置
- Leetcode 之Largest Rectangle in Histogram(40)
- Android问题集锦
- 手机掉水里的终极解决方案!
- poj 2559 Largest Rectangle in a Histogram(单调栈)
- hdu 5697 刷题计划
- js jquery 实现html页面之间参数传递(单一参数、对象参数传递)