2 条题解

  • 0
    @ 2024-9-4 18:59:14

    AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 255;
    const int INF = 1e9;
    int n, T, t[maxn], m1, d[maxn], m2, e[maxn];
    int f[maxn][maxn];
    bool tl[maxn][maxn], tr[maxn][maxn];
    
    void init() {
    	for (int i = 1; i <= n; i++)
    		for (int j = 0; j <= T; j++)
    			f[i][j] = INF, tl[i][j] = tr[i][j] = 0;
    	f[1][0] = 0;
    }
    
    int main() {
    	for (int cas = 1; ; cas++) {
    		scanf("%d", &n);
    		if (!n) break;
    		scanf("%d", &T);
    		for (int i = 1; i < n; i++)
    			scanf("%d", t+i);
    		scanf("%d", &m1);
    		for (int i = 1; i <= m1; i++)
    			scanf("%d", d+i);
    		scanf("%d", &m2);
    		for (int i = 1; i <= m2; i++)
    			scanf("%d", e+i);
    		init();
    		for (int i = 1; i <= m1; i++) {
    			int x = d[i];
    			tr[1][x] = true;
    			for (int j = 2; j <= n; j++) {
    				x += t[j-1];
    				if (x > T) break;
    				tr[j][x] = true;	
    			}
    		}
    		for (int i = 1; i <= m2; i++) {
    			int x = e[i];
    			tl[n][x] = true;
    			for (int j = n-1; j >= 1; j--) {
    				x += t[j];
    				if (x > T) break;
    				tl[j][x] = true;
    			}
    		}
    		for (int j = 0; j < T; j++) {
    			for (int i = 1; i <= n; i++) {
    				if (f[i][j] == INF)
    					continue;
    				f[i][j+1] = min(f[i][j+1], f[i][j] + 1);
    				if (i < n && tr[i][j]) {
    					int y = j + t[i];
    					if (y <= T)
    						f[i+1][y] = min(f[i+1][y], f[i][j]);
    				}
    				if (i > 1 && tl[i][j]) {
    					int y = j + t[i-1];
    					if (y <= T)
    						f[i-1][y] = min(f[i-1][y], f[i][j]);
    				}
    			}
    				
    		}
    		if (f[n][T] == INF)
    			printf("Case Number %d: impossible\n", cas);
    		else
    			printf("Case Number %d: %d\n", cas, f[n][T]);
    	}
    	return 0;
    }
    
    • 0
      @ 2024-9-4 18:56:57

      错误代码:

      #include <bits/stdc++.h>
      using namespace std;
      const int maxn = 255;
      const int INF = 1e9;
      int n, T, t[maxn], m1, d[maxn], m2, e[maxn];
      int f[maxn][maxn];
      bool tl[maxn][maxn], tr[maxn][maxn];
      
      void init() {
      	for (int i = 1; i <= n; i++)
      		for (int j = 0; j <= T; j++)
      			f[i][j] = INF, tl[i][j] = tr[i][j] = 0;
      	f[1][0] = 0;
      }
      
      int main() {
      	for (int cas = 1; ; cas++) {
      		scanf("%d", &n);
      		if (!n) break;
      		scanf("%d", &T);
      		for (int i = 1; i < n; i++)
      			scanf("%d", t+i);
      		scanf("%d", &m1);
      		for (int i = 1; i <= m1; i++)
      			scanf("%d", d+i);
      		scanf("%d", &m2);
      		for (int i = 1; i <= m2; i++)
      			scanf("%d", e+i);
      		init();
      		for (int i = 1; i <= m1; i++) {
      			int x = d[i];
      			tr[1][x] = true;
      			for (int j = 2; j <= n; j++) {
      				x += t[j-1];
      				if (x > T) break;
      				tr[j][x] = true;	
      			}
      		}
      		for (int i = 1; i <= m2; i++) {
      			int x = e[i];
      			tl[n][x] = true;
      			for (int j = n-1; j >= 1; j--) {
      				x += t[j];
      				if (x > T) break;
      				tl[j][x] = true;
      			}
      		}
      		for (int j = 0; j < T; j++) {
      			for (int i = 1; i <= n; i++) {
      				if (f[i][j] == INF)
      					continue;
      				f[i][j+1] = min(f[i][j+1], f[i][j] + 1);
      				if (i < n && tr[i][j]) {
      					int y = j + t[i];
      					if (y <= T)
      						f[i+1][y] = min(f[i+1][y], f[i][j]);
      				}
      				if (i > 1 && tr[i][j]) {
      					int y = j + t[i-1];
      					if (y <= T)
      						f[i-1][y] = min(f[i-1][y], f[i][j]);
      				}
      			}
      				
      		}
      		if (f[n][T] == INF)
      			printf("Case Number %d: impossible\n", cas);
      		else
      			printf("Case Number %d: %d\n", cas, f[n][T]);
      	}
      	return 0;
      }
      
      • 1

      信息

      ID
      19
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      (无)
      递交数
      9
      已通过
      3
      上传者