HUST team contest #E A Mountain Road||poj 3846 (dp)

比赛的时候以为是贪心...

想了好久.

不过最后没敢写,因为没办法证明正确性,只是直觉==

最后剩下的时间给队友改另一道题了..

果然明智...

蠢的人的直觉真心不靠谱..

这题是dp

我们可以把车按照方向的不同分为A车和B车

dp[i][j][0..1]表示已经经过了a方向的i辆车,经过了b方向的j辆车,并且最后一辆车是a/b方向的情况的离开道路的时间.

似乎问题不大.

然后就一直wa...

wa到怀疑人生好么!!!

最后发现

问题出在!

dp数组初始化赋值成正无穷的时候,溢出啦!

然后我搜了下,发现0x7fffffff果然不是什么好东西!

以后正无穷用0x3f3f3f3f

这东西>1E9,相加不超过int

而且最重要的是,如果定义 inf = 0x3f3f3f3f

0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))

不要使用0x7fffffff!

不要使用0x7fffffff!

不要使用0x7fffffff!

  1/*************************************************************************
  2	> File Name: code/2015summer/0821/E.cpp
  3	> Author: 111qqz
  4	> Email: rkz2013@126.com 
  5	> Created Time: 2015年08月21日 星期五 01时28分23秒
  6 ************************************************************************/
  7#include<iostream>
  8#include<iomanip>
  9#include<cstdio>
 10#include<algorithm>
 11#include<cmath>
 12#include<cstring>
 13#include<string>
 14#include<map>
 15#include<set>
 16#include<queue>
 17#include<vector>
 18#include<stack>
 19#define y0 abc111qqz
 20#define y1 hust111qqz
 21#define yn hez111qqz
 22#define j1 cute111qqz
 23#define tm crazy111qqz
 24#define lr dying111qqz
 25using namespace std;
 26#define REP(i, n) for (int i=0;i<int(n);++i)  
 27typedef long long LL;
 28typedef unsigned long long ULL;
 29const int inf = 0x7fffffff;
 30const int N=2E2+7;
 31int dp[N][N][2];
 32int cntA,cntB;
 33struct Q{
 34    int beg,t;
 35    char dir;
 36}q[N],a[N],b[N];
 37void init(){
 38    int n;
 39    int beg,time;
 40    char dir;
 41    scanf("%d",&n);
 42     cntA = 0 ;
 43     cntB = 0 ;
 44    for ( int i = 0 ; i < n ;i++){
 45	cin>>q[i].dir>>q[i].beg>>q[i].t;
 46    }
 47    for ( int  i = 0 ; i < n ; i ++){
 48	if (q[i].dir=='A'){
 49	    cntA++;
 50	    a[cntA].beg = q[i].beg;
 51	    a[cntA].t = q[i].t;
 52	}
 53	else{
 54	    cntB++;
 55	    b[cntB].beg = q[i].beg;
 56	    b[cntB].t = q[i].t;
 57	}
 58    }
 59    for ( int i = 0 ; i <= cntA ; i ++){
 60	for ( int j = 0 ; j <= cntB ; j++){
 61	    dp[i][j][0]=dp[i][j][1]=inf/2; //正无穷溢出了....调了三个小时..妈蛋
 62	}
 63    }
 64    dp[0][0][0]=dp[0][0][1]=0;
 65}
 66void solve(){
 67    int l,r;
 68    l = r = 0 ;
 69    for ( int i = 0 ; i<= cntA ; i++){
 70	for ( int j = 0 ; j <= cntB ; j++){
 71	    l = dp[i][j][1]-10;
 72	    r = dp[i][j][1]-10;
 73	    for ( int k = i+1 ; k<=cntA ; k++){
 74 		l = max(l+10,a[k].beg);
 75		r = max(r+10,l+a[k].t);
 76		dp[k][j][0] = min (r,dp[k][j][0]);
 77	    }
 78	    l = dp[i][j][0]-10;
 79	    r = dp[i][j][0]-10;
 80	    for ( int k = j+1 ; k<=cntB ; k++){
 81	 	l = max(l+10,b[k].beg);
 82		r = max(r+10,l+b[k].t);
 83		dp[i][k][1] = min (r,dp[i][k][1]);
 84	    }
 85	}
 86    }
 87}
 88int main(){
 89    int T;
 90    cin>>T;
 91    while (T--){
 92	init();
 93	solve();
 94	int ans = 0 ;
 95	ans =  min (dp[cntA][cntB][0],dp[cntA][cntB][1]);
 96	//	printf("%d\n",ans);
 97	cout<<ans<<endl;
 98    }
 99	return 0;
100}