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.
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.
2
2
20 25
40
1
8
08:00:40 am
08:00:08 am
题意:
买票。可以一个人买,也可以两个人买,问怎样买可以花费最少
(选择性问题也能用动态规划的思想解决)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
void print(int s){
int H=8,M=0,S=0;
S+=s;
if(S>=60){
M=S/60;
S=S-M*60;
}
if(M>=60){
int t=M/60;
H += t;
M=M-t*60;
}
printf("%02d:%02d:%02d %s\n",H,M,S,H>=12?"pm":"am");
}
int main(){
int n,tx;
int s[2005],d[2005];
int dp[2005];
scanf("%d",&tx);
while(tx--){
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
for(int i=2;i<=n;i++)
scanf("%d",&d[i]);
dp[1]=s[1];
dp[2]=min(s[1]+s[2],d[2]);
for(int i=3;i<=n;i++){
dp[i]=min(dp[i-1]+s[i],dp[i-2]+d[i]);
}
print(dp[n]);
}
return 0;
}