HDU1260
不把题目复制过来了,只写题意:
电影院卖票,要求尽早卖完,给定两个序列,一个长度为n,表示第i个人只买一张票所需要的时间
第二个序列表示第i个人与前面的第i-1个人一起买两张票所需要的时间,如果两张票同时售卖的时间比两个人单独买票的时间短,则要选择两个人一起买票
这题给的数据是:
2(2组数据)
2(2个人买票)
20 25(两个人单独买票分别需要的时间)
40(两个人一起买票所需要的时间)
1(1个人买票)
8(一个人买票所需要的时间)
对于dp的分析:
扫描二维码关注公众号,回复:
5258436 查看本文章
step1:分析dp代表的数字是谁
step2:确定开二维数组还是一维数组:
step3:确定是从前往后还是从后往前,这题不是逆推的题,所以从1~n
step4:确定过程,过程就根据题意模拟一下就好了
如果开一维数组,那么dp[x]表示卖给x个人所需要的最小时间
a[i]表示单独买的时间,b[i]表示两个人一起买需要的时间
方程为:dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
如果开二维数组,那么dp[x][0]表示卖给了x个人,且第x个人单独买票,dp[x][1]表示卖给了x个人,且第x个人和第x-1个人是一起买票的
方程为:dp[i][0]=min(dp[i-1][0]+dp[i-1][1])+a[i];
dp[i][1]=dp[i-1][0]+b[i]-a[i-1];
两种方法都可以,我选择的是第一种
另外,这道题要注意时间的输出格式
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[2019],b[2019],dp[2019],ans,h,m,s; 4 int main(){ 5 int t,n; 6 cin >> t; 7 while(t--){ 8 cin >> n; 9 h = 8, m = 0, s = 0; 10 for (int i = 1; i <= n;i++) 11 cin >> a[i]; 12 for (int i = 2; i <= n;i++) 13 cin >> b[i]; 14 dp[1] = a[1]; 15 for (int i = 2; i <= n;i++){ 16 dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + b[i]); 17 } 18 ans = dp[n]; 19 s = ans% 60; 20 m = ans / 60; 21 h = h + (m / 60); 22 m %= 60; 23 if(h>12) 24 printf("%.2d:%.2d:%.2d pm\n", h-12, m, s); 25 else 26 printf("%.2d:%.2d:%.2d am\n", h, m, s); 27 28 } 29 30 system("pause"); 31 return 0; 32 }