1 条题解

  • 0
    @ 2025-2-14 21:20:43

    C++ :

    #include <cstdio>
    #include <cstring>
    
    #define  maxn  10005LL
    #define  maxm  1005LL
    #define  infi  0x3f3f3f3f
    
    int n , m , k ;
    int up[maxn] = {0} , down[maxn] = {0} ;
    int L[maxn] = {0} , R[maxn] = {0} ;
    int f[maxn][maxm] = {0} ;
    int flag[maxn] = {0} ;
    int cnt = 0 ;
    
    void dp() {
    	memset(f , 0x3f , sizeof (f)) ;
    	memset(f[0] , 0 , sizeof (f[0])) ;
    	int i , j , k , p , t ;
    	bool False = false ;
    	for (i = 1 ; i <= n ; i ++ ) {
    		False = true ;
    		if (flag[i]) {
    			/*存在障碍*/
    			cnt ++ ;
    			for (j = 1 ; j < R[flag[i]] ; j ++ ) {
    				/*上升*/
    				if (j-up[i-1] < 1) continue ;
    				if (f[i-1][j-up[i-1]]+1 < f[i][j]) f[i][j] = f[i-1][j-up[i-1]]+1 ;
    				if (f[i][j-up[i-1]]+1 < f[i][j]) f[i][j] = f[i][j-up[i-1]]+1 ;
    				if (j>L[flag[i]] && f[i][j]!=infi) False = false ;
    			}
    			for (j = L[flag[i]]+1 ; j < R[flag[i]] ; j ++ ) {
    				/*下落*/
    				if (j+down[i-1] > m) break ;
    				if (f[i-1][j+down[i-1]] < f[i][j]) f[i][j] = f[i-1][j+down[i-1]] ;
    				if (f[i][j] != infi) False = false ;
    			}
    			for (j = 1 ; j <= L[flag[i]] ; j ++ ) f[i][j] = infi ;
    		} else {
    			/*不存在障碍*/
    			for (j = up[i-1]+1 ; j <= m ; j ++ ) {
    				/*上升*/
    				if (j-up[i-1] < 1) continue ;
    				if (f[i-1][j-up[i-1]]+1 < f[i][j]) f[i][j] = f[i-1][j-up[i-1]]+1 ;
    				if (f[i][j-up[i-1]]+1 < f[i][j]) f[i][j] = f[i][j-up[i-1]]+1 ;
    				if (f[i][j] != infi) False = false ;
    			}
    			for (j = 1 ; j < m ; j ++ ) {
    				/*下落*/
    				if (j+down[i-1] > m) break ;
    				if (f[i-1][j+down[i-1]] < f[i][j]) f[i][j] = f[i-1][j+down[i-1]] ;
    				if (f[i][j] != infi) False = false ;
    			}
    			for (j = m-up[i-1]+1 ; j <= m ; j ++ ) {
    				/*撞顶*/
    				if (j < 1) continue ;
    				if (f[i-1][j]+1 < f[i][m]) f[i][m] = f[i-1][j]+1 ;
    				if (f[i][j]+1 < f[i][m]) f[i][m] = f[i][j]+1 ;
    				if (f[i][m] != infi) False = false ;
    			}
    		}
    		if (False) {
    			printf("0\n%d\n", cnt-1 ) ; return ;
    		}
    	}
    	cnt = infi ;
    	for (i = 1 ; i <= m ; i ++ ) if (f[n][i] < cnt) cnt = f[n][i] ;
    	printf("1\n%d\n", cnt ) ;
    }
    
    int main() {
    	//    freopen("birda.in" ,"r",stdin ) ;
    	//    freopen("birda.out","w",stdout) ;
    	int i , p ;
    	scanf("%d%d%d", &n , &m , &k ) ;
    	for (i = 0 ; i < n ; i ++ ) {
    		scanf("%d%d", &up[i] , &down[i] ) ;
    	}
    	for (i = 1 ; i <= k ; i ++ ) {
    		scanf("%d%d%d", &p , &L[i] , &R[i] ) ;
    		flag[p] = i ;
    	}
    	dp() ;
    	    fclose(stdin ) ; fclose(stdout) ;
    	return 0 ;
    }
    /*
    10 10 6
    3 9
    9 9
    1 2
    1 3
    1 2
    1 1
    2 1
    2 1
    1 6
    2 2
    1 2 7
    5 1 5
    6 3 5
    7 5 8
    8 7 9
    9 1 3
    */
    /*
    10 10 4
    1 2
    3 1
    2 2
    1 8
    1 8
    3 2
    2 1
    2 1
    2 2
    1 2
    1 0 2
    6 7 9
    9 1 4
    3 8 10
    */
    
    • 1

    信息

    ID
    857
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者