HDU1260 简单DP

要么就是前面x-1个人的最优时间加上给第x个人单独买票的时间,要么就是前面x-2个人的最优时间加上给第x-1和x个人一起买票的时间。

半年前做得出来的题,半年后差点做不出来。我真是越活越回去了。

d p [ x ] = m i n 2 ( d p [ x 1 ] + S x , d p [ x 2 ] + D x 1 )

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<set>
typedef long long ll;

/* -=<*ERIKABEATS*>=- */

#define DEBUG_FLAG
#ifdef DEBUG_FLAG
#define dprintf printf
#else
#define dprintf
#endif

/* namespace */using namespace std;
//* a^n mod m */ll modpow(ll a,ll n,ll m){ll res=1;while(n){if(n&1){res*=a%m;res%=m;a*=a%m;a%=m;}else{a=(a*a)%m;}n>>=1;}return res;}
//* Ax+By=GCD(A,B) */ll extgcd(ll a,ll b,ll* x,ll* y){if(!b){*x=1,*y=0;return a;}else{ll r=extgcd(b,a%b,x,y);ll t=*x;*x=*y;*y=t-(a/b)*(*y);return r;}}
//* modinv */ll modinv(ll n,ll m){ll x,y,preres=extgcd(n,m,&x,&y);if(preres==1){return (x+m)%m;}else return -1;}
#define MODFAC(x,m) ll _modfac[x]={1}; void _modfac_init(){for(int i=1;i<x;i++){_modfac[i]=(i*_modfac[i-1])%m;}}
/* modfac */ #undef MODFAC /* use with MODFAC(cnt,mod) ...; _modfac_init();  */
//* modC */ll modC(ll from,ll cnt,ll m){return((_modfac[from]*modinv((cnt*(from-cnt))%m,m))%m);}

/* AH. I SEE YOU'RE A MAN OF CULTURE AS WELL. */



int N,K;
int S[2005],D[2005];
int dp[2005];
int min2(int a,int b){return a>b?b:a;}
int main(){
    scanf("%d",&N);for(int _t=1;_t<=N;_t++){
        scanf("%d",&K);
        for(int i=1;i<=K;i++)scanf("%d",&S[i]);
        for(int i=1;i<=K-1;i++)scanf("%d",&D[i]);
        dp[0]=0;dp[1]=S[1];
        for(int i=2;i<=K;i++){
            dp[i] = min2(dp[i-1]+S[i],dp[i-2]+D[i-1]);
        }
        int time = 8*60*60;
        bool isam = true;
        time += dp[K];
        if(time>=43200){time-=43200;isam=false;}

        printf("%02d:%02d:%02d %s\n",time/(60*60),(time/60)%60,time%60,isam?"am":"pm");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/erikabeats/article/details/79487757