题目大意:
现在有n个人要买电影票,如果知道每个人单独买票花费的时间,还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票。
Input
给出 N(1<=N<=10),表示有N组样例
给出K (1<=K<=2000),表示有K个人买票..
给出K个数表示这个人单独买票会花的时间..保证每个数 (0s<=Si<=25s)
给出K-1个数,表示这个人和前面那个人一起买票会花的时间..保证每个数 (0s<=Si<=50s)
Output
对于每一组数据,你需要给出电影院售票结束的时间,售票开始的时间为 08:00:00 am. 时间格式为: HH:MM:SS am|pm. 具体看样例输出
Sample Input
2 2 20 25 40 1 8Sample Output
08:00:40 am 08:00:08 am题解:
不难想出状态为dp[i]表示前i个人买票的最短时间.
dp[i]=min(dp[i-2]+b[i],dp[i-1]+a[i])
即表示要么选择第i-1个人和第i个人一起买,要么选择第i个人单独买。
然后总秒数就是dp[n],在进行一下时间转换就行了。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e5+7; int dp[N],a[N],b[N]; int main(){ int T=read(); while(T--){ int n=read(); rp(i,1,n) a[i]=read(); rp(i,2,n) b[i]=read(); mst(dp,INF); dp[0]=0,dp[1]=a[1]; rp(i,2,n) dp[i]=min(dp[i-2]+b[i],dp[i-1]+a[i]); int ans=dp[n]; // cout<<dp[n]<<endl; if((8+ans/3600)%24<=12&&(8+ans/3600)%24>=0) printf("%02d:%02d:%02d am\n",(8+ans/3600)%24,ans/60%60,ans%60); else printf("%02d:%02d:%02d pm\n",(8+ans/3600)%24,ans/60%60,ans%60); } return 0; } /* 1 7 3 3 3 6 6 2 2 */
dp训练计划——hdu1260简单dp
猜你喜欢
转载自blog.csdn.net/qq_43472263/article/details/104603260
今日推荐
周排行