当前位置: 代码迷 >> 综合 >> (复习次数:1)HDU 1260 Tickets【线性dp】
  详细解决方案

(复习次数:1)HDU 1260 Tickets【线性dp】

热度:95   发布时间:2023-11-21 17:24:19.0

http://acm.hdu.edu.cn/showproblem.php?pid=1260
居然自己写出来又一遍过了,开心
经验:找规律,主要是开始列前四个的组成情况,就发现:
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
就很赞很开心很开心
因为我好久都习惯错几个小时了,别人却那么厉害,都不敢碰ACM了,现在调整状态,看到自己还是可以的,很开心很开心,在现在特殊的心情下。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define N 2003
using namespace std;
int a[N],b[N],dp[N];//单人,双人(用前者序号)记录,dp 
void trans(int t)//把秒换为时间输出 
{
    int h,m,s;s=t%60;t/=60;m=t%60;t/=60;h=8+t;if(h<12){
    printf("%02d:%02d:%02d am\n",h,m,s);}else{
    printf("%02d:%02d:%02d am\n",h-1,m,s);}
}
int main()
{
    //FILE*fp=fopen("text.in","r");//------记得最后注释掉!! int n;scanf("%d",&n);//fscanf(fp,"%d",&n);while(n--){
    int t=0;int k;scanf("%d",&k);//fscanf(fp,"%d",&k);for(int i=1;i<=k;i++){
    //fscanf(fp,"%d",&a[i]);scanf("%d",&a[i]);}for(int i=1;i<k;i++){
    //fscanf(fp,"%d",&b[i]);scanf("%d",&b[i]);}dp[0]=0;dp[1]=a[1];for(int i=2;i<=k;i++){
    dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);}trans(dp[k]);}return 0;
}

复习代码:
5/18

#include<bits/stdc++.h>
#ifdef LOCAL
FILE*FP=freopen("text.in","r",stdin);
#endif
#define _forplus(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[2005],b[2005],s[2005];
void print(int sum){
    int h,m,s,flag=0;//ams=sum%60;sum/=60;m=sum%60;sum/=60;h=8+sum;if(h>=12)flag=1;if(h>12)h-=12;printf("%02d:%02d:%02d %s\n",h,m,s,(flag?"pm":"am"));
}
int main(){
    int t;scanf("%d",&t);while(t--){
    int n;scanf("%d",&n);_forplus(i,1,n){
    scanf("%d",&a[i]);}_forplus(i,1,n-1){
    scanf("%d",&b[i]);}s[0]=0;s[1]=a[1];_forplus(i,2,n){
    s[i]=min(a[i]+s[i-1],b[i-1]+s[i-2]);}print(s[n]);}return 0;
}