HDU - 1260 Tickets(水一水,正反馈)
input:
2 2 20 25 40 1 8
output:
08:00:40 am 08:00:08 am
题目大意:
有n个人,每个人的取票时间为single[i],如果同时给相邻两个人的取票时间为twice[i],求所有人都取完票的最 短时间。
分析:
dp。dp[i]=到第i个人所要花的最短时间。转移方程特别好想: dp[i]=min(dp[i-1]+single[i],dp[i-2]+twice[i-1])。
code:
#define frp #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f; const ll inf = 0x7fffff; const int maxn = 1000; const int MAXN = 10000; int dp[MAXN]; int single[MAXN],twice[MAXN]; void solve() { int T; cin>>T; while(T--){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>single[i]; } for(int i=1;i<=n-1;i++){ cin>>twice[i]; } dp[0]=0; dp[1]=single[1]; for(int i=2;i<=n;i++){ dp[i]=min(dp[i-1]+single[i],dp[i-2]+twice[i-1]); } int ansTime=dp[n]; int hh=ansTime/3600; int mm=(ansTime%3600)/60; int ss=ansTime%60; hh+=8; if(hh>12){ printf("%02d:%02d:%02d pm\n",hh-12,mm,ss); }else{ printf("%02d:%02d:%02d am\n",hh,mm,ss); } } } int main() { // ios_base::sync_with_stdio(0); // cin.tie(0); // cout.tie(0); #ifdef frp freopen("D:\\coding\\c_coding\\in.txt", "r", stdin); // freopen("D:\\coding\\c_coding\\out.txt", "w", stdout); #endif solve(); return 0; }