Tickets HDU - 1260
题意:
著名的宫崎骏动画片《千与千寻》在中传1500报重映,中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票,所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞,就可以免费领取一张电影票。带着对童年的回忆,大家早早的就排队等待领票。为了让大家能够早点领取到心仪的门票,动画学院学生会想知道他们什么时候可以最快把票发完?
最好的方法就是分好几处同时发票,并且在每处都尽量减少票的领取时间,让相邻的人一起领票。但是因为每处都只有两位同学在发票,因此每次只能是单个人领票或者相邻两个人一起领票,人再多就容易处理不过来导致出错或降低效率。
作为理工科的你们,更善于推理和计数,假设你们知道各处排队的人数、每个人领票所需的时间,以及相邻的两个人一起领票所需的时间。你们能否帮助动画学院学生会计算一下各处分别最早能在什么时候把票发完吗?
题解:
设dp[i]表示分发前i个人所需要的最短时间
对于第i个人,可以和第i-1个人一起领票,也可以自己独自领票
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
注意题目输出格式,已经am/pm的情况
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=2e4+9;
int dp[maxn];
int a[maxn],b[maxn];
int main()
{int t;cin>>t;while(t--){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<n;i++)cin>>b[i];dp[0]=0;dp[1]=a[1];for(int i=2;i<=n;i++){dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);}//cout<<dp[n]<<endl;int hh=8,mm=0,ss=0;hh+=dp[n]/3600;dp[n]-=dp[n]/3600*3600;mm+=dp[n]/60;dp[n]-=dp[n]/60*60;ss+=dp[n];if(hh>=12)printf("%02d:%02d:%02d pm\n",hh,mm,ss);else printf("%02d:%02d:%02d am\n",hh,mm,ss);}return 0;
}