CodeForces 812 B.Sagheer, the Hausmeister

原创 2018年04月16日 17:23:01

题意

给你一个n层楼每层m个房间+2个楼梯道,从第一层的左楼梯口开始过一个+1min,求关闭所有灯的最短时间.

题解

dp记录每层楼的左右开灯房间,维护楼梯口的时间;

dp[i][m+1] = min(dp[i][m+1]+2*(m+1-l), k+m+1);

dp[i][0] = min(dp[i][0]+2*r, dp[i][m+1]+m+1);

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

const int maxn = 20, maxm = 105;
int dp[maxn][maxm+2];
char mapp[maxn][maxm+2]; 

int main(){
	int n, m;
	while(~scanf("%d %d", &n, &m)){
		int x = -1, y = -1, ok = 0;
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m+2; j++){
				scanf("%1d", &mapp[i][j]);
				if(mapp[i][j] == 1 && !ok){
					x = i;
					y = j;
					ok = 1;
				}
			}
		}
		if(x == -1 && y == -1){
			printf("0\n");
		}
		else{
			int l, r;
			memset(dp, INF, sizeof(dp));
			dp[n-1][0] = 0;
			for(int i = n-1; i >= 0; i--){
				l = 0;
				r = 0;
				dp[i][0] = min(dp[i][0], dp[i+1][0]+1);
				dp[i][m+1] = min(dp[i][m+1], dp[i+1][m+1]+1);
				for(int j = 1; j <= m; j++){
					if(mapp[i][j] == 1){
						if(l == 0){
							l = j;
						}
						r = j;
					}
				}
				int k = dp[i][0];
				if(r){
					dp[i][0] = min(dp[i][0]+2*r, dp[i][m+1]+m+1);
				}
				if(l){
					dp[i][m+1] = min(dp[i][m+1]+2*(m+1-l), k+m+1);
				}
			}
			l = 0;
			r = 0;
			for(int i = 0;i <= m+1; i++){
				if(mapp[x][i] == 1){
					if(l == 0){
						l = i;
					}
					r = i;
				}
			}
			int ans = min(dp[x+1][0]+r+1, dp[x+1][m+1]+m+2-l);
			if(x == n-1){
				ans = r;
			}
			printf("%d\n", ans);
		}
	}
}

Codeforces812B Sagheer, the Hausmeister

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megab...
  • Jelly_acm
  • Jelly_acm
  • 2017-06-02 20:47:56
  • 302

Codeforces 812B-Sagheer, the Hausmeister

Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megabyte...
  • a664607530
  • a664607530
  • 2017-06-02 10:43:33
  • 695

Sagheer, the Hausmeister CodeForces - 812B dp

题目链接 思路: 只说一下这个题dp的思想吧,我们对于每一行都记录最左端未关灯的位置,和最右端未关灯的位置,那么对于左端和右端的楼梯维护一下是将本层楼灯全部关闭原路返回花的时间少,还是从右...
  • HowardEmily
  • HowardEmily
  • 2017-06-03 17:49:15
  • 288

Codeforecs 812B Sagheer, the Hausmeister DP

点击打开链接 题意:n 到上一层只能从左端或者右端走 设dp[i][0/1] : 灭了前i层的灯 &&当前在第i层左/右端时的最小时间 dp[i][0]=min(dp[i+1][0]+1+(r[i]-...
  • Jeremy1149
  • Jeremy1149
  • 2017-06-02 02:22:01
  • 312

B. Sagheer, the Hausmeister

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megabytes i...
  • qq_33362864
  • qq_33362864
  • 2017-06-02 15:22:16
  • 217

Codeforces 812 B Sagheer, the Hausmeister

题目链接:http://codeforces.com/contest/812/problem/B题意:题目中的意思就是说有一栋楼有n层每层有m个房间,两边各有一个楼梯,上下楼梯需要的时间是1分钟,从一...
  • xjh_shin
  • xjh_shin
  • 2017-06-02 17:53:54
  • 254

Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister(动态规划)

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megab...
  • HHH_go_
  • HHH_go_
  • 2017-06-02 18:16:47
  • 400

codeforces 812 B Sagheer, the Hausmeister(枚举)

题意: 有n层楼,小明需要从一层楼的左边开始去关n层楼种还未关灯的房间的灯,其中一层中最左边和最右边都是楼梯,问小明关完所有灯的时间,不需要计算返回的时间 解题思路: 小明到达一层楼只有从左边和右...
  • johsnows
  • johsnows
  • 2017-06-02 17:28:56
  • 218

codefoces 812B——Sagheer, the Hausmeister(动态规划)

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megab...
  • say_c_box
  • say_c_box
  • 2017-06-02 10:20:43
  • 454

Codeforces 812

A 判断会不会撞到人 判一下有人走的路有没有车经过就行了 B n*(m+2)的矩形,一开始在左下角,移动一格需要1的时间,关灯不需要时间,两端可以上楼 问关掉所有的灯最少需要的时间 DP一下...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2017-06-03 13:31:40
  • 213
收藏助手
不良信息举报
您举报文章:CodeForces 812 B.Sagheer, the Hausmeister
举报原因:
原因补充:

(最多只允许输入30个字)