本文主要是介绍[ACM] hdu 1260 Tickets (动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Tickets
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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.
Input
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.
Output
Sample Input
2 2 20 25 40 1 8
Sample Output
08:00:40 am 08:00:08 am
Source
解题思路:
一个人可以单独买票花费一定的时间,也可以两个人一起买票,也给定一个时间,给出K个人的单独买票时间和K-1个相邻的两个人一起买票的时间,问一共花费的最小时间。
用sin[i]为每个人单独买票的时间,dou[ i+1]为两个人一起买票的时间。
状态转移方程为: dp[i] = min(dp[i-1]+sin[i] , dp[i-2] + dou[i] )。当前第i个人分为两种情况,一是单独买,而是和前面的一块买。
代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=2005;
int dp[maxn];
int sin[maxn];//每个人单独买票时间
int dou[maxn];//相邻两个人一块买票时间
int n,k;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%d",&sin[i]);
for(int i=2;i<=k;i++)
scanf("%d",&dou[i]);
dp[0]=0;
dp[1]=sin[1];
for(int i=2;i<=k;i++)
dp[i]=min(dp[i-1]+sin[i],dp[i-2]+dou[i]);
int h=dp[k]/3600+8;
int m=dp[k]/60%60;
int s=dp[k]%60;
if(h>12)
cout<<setiosflags(ios::fixed)<<setw(2)<<setfill('0')<<h<<":"<<setw(2)<<m<<":"<<setw(2)<<s<<" pm"<<endl;
else
cout<<setiosflags(ios::fixed)<<setw(2)<<setfill('0')<<h<<":"<<setw(2)<<m<<":"<<setw(2)<<s<<" am"<<endl;
}
return 0;
}
这篇关于[ACM] hdu 1260 Tickets (动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!