POJ 2336 DP

头疼啊。这个甚至都不是自己独立做出来的。
DP这玩意,做得出来的话就能做出来,做不出来的还真是死活都做不出来。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
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 T;
int n,t,m;
// dp[i] 计算的是运第i辆车需要的最小时间(附带来回。一般而言,渡轮将最后一辆
// 车从A岸运「到」B岸的时间点为全部运送完成;这里不这么处理:即,将渡轮送到后
// 「返回到」A岸的时间点作为全部运达的时间点。
// res[i] 计算的是来回数。
int dp[1450], res[1450];
int max2(int a,int b){return a>b?a:b;}
int main(){
    scanf("%d",&T);while(T--){
        scanf("%d%d%d",&n,&t,&m);
        memset(dp,0,sizeof(dp));
        memset(res,0,sizeof(res));
        for(int i=1;i<=m;i++){
            int a; scanf("%d",&a);
            // 2*t即一个来回的时间。i-n是在expect渡轮每次都尽量运n辆车,
            // max2(dp[max2(i-n,0)],a)则是在expect 车在dp[max2(i-n,0)]这一时间点上
            // 可能还没有到。
            dp[i] = max2(dp[max2(i-n,0)],a)+2*t;
            res[i] = res[max2(i-n,0)]+1;
        }
        // 最后减去这半个来回。
        printf("%d %d\n",dp[m]-t,res[m]);
    }
    return 0;
}

猜你喜欢

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