HDU Tickets(简单的dp递推)
2014-08-03 18:23
471 查看
Tickets
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 972 Accepted Submission(s): 495
[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]
浙江工业大学第四届大学生程序设计竞赛
一开始状态方程考虑的非常复杂 一直在想着如何利用前一个状态推下一个状态,所以开始我的一个状态里有三种情况,然后这种复杂的情况有点驾驭不了,没想到直接可以用前两种状态对当前状态。悲剧
#include<iostream> using namespace std; int a[2001],b[2001],dp[2001]; #define min(x,y) (x)<(y)? (x):(y) int n; void pre() { int i,j; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=2;i<=n;i++) cin>>b[i]; } void solve() { int i,j; dp[0]=0;dp[1]=a[1]; for(i=2;i<=n;i++) dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]); int num=dp ; int h,m,s; h=num/60/60;num-=h*60*60; m=num/60;num-=m*60; s=num; printf("%02d:%02d:%02d",h+8>12? h+8-12:h+8,m,s); printf(" %s\n",h+8>12? "pm":"am"); } int main(void) { int t,i,j; while(cin>>t){ while(t--){ pre(); solve(); } } return 0; }
相关文章推荐
- timus 1225 flags 基础DP 简单递推
- dp的简单递推笔记1
- POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)
- HD 2048 数塔 DP(简单递推)
- 简单dp之递推(1)--CF 429B B.Working out
- [蓝桥杯] 算法训练 未名湖边的烦恼(dp递推或简单dfs)
- [递推简单dp]-hdu 2041 超级楼梯
- Timus Online Judge1009---K-based Numbers(简单递推dp)
- hdu Tickets 1260 (简单DP)
- hdu 5965(dp递推,简单题)
- bzoj 2431 简单dp/递推
- [递推简单dp]-hdu 2084 数塔
- 递推关系的运用加简单DP【UVA11137Ingenuous Cubrency】-------2015年1月27日
- poj 1157 简单递推dp
- [递推简单dp]-hdu 2050 折线分割平面
- 简单dp之递推(2)--ZOJ 3747
- boj 1345 二叉树问题 简单的dp
- hdoj 2044 一只小蜜蜂... 解题报告 (简单递推)
- POJ 3298 递推,DP
- zoj 2402 简单dp