zoukankan      html  css  js  c++  java
  • Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister

    http://codeforces.com/contest/812/problem/B

    题意:

    有n层楼,每层楼有m个房间,1表示灯开着,0表示灯关了。最两侧的是楼梯。

    现在每从一个房间移动到另一个房间需要1时间,走楼梯也需要1时间,求关完所有灯所需的最少时间。

    思路:

    d【i】【0】表示第i层楼关完灯后从左边楼梯上楼的最少时间,d【i】【1】代表右楼梯。

    预处理一下,开两个数组保存每层楼开灯房间的最左边的值和最右边的值,这样也就确定了要走的范围。

    对于上面灯全部关了的楼层,可以不用去考虑它。

    有个错误让我wro了好久!!

    就是在dp的时候,如果这是中间的一个全部关了灯的楼层,需要特殊计算,不然计算d【i】【1】是计算错误的。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<sstream>
     6 #include<vector>
     7 #include<stack>
     8 #include<queue>
     9 #include<cmath>
    10 #include<map>
    11 using namespace std;
    12 typedef long long ll;
    13 typedef pair<int,long long> pll;
    14 const int INF = 0x3f3f3f3f;
    15 const int maxn=200+5;
    16 
    17 int n,m;
    18 
    19 int l[maxn],r[maxn];
    20 int d[maxn][2];
    21 char g[maxn][maxn];
    22 
    23 int main()
    24 {
    25     while(~scanf("%d%d",&n,&m))
    26     {
    27         memset(l,0,sizeof(l));
    28         memset(r,0,sizeof(r));
    29 
    30         for(int i=n;i>=1;i--)
    31         {
    32             scanf("%s",g[i]);
    33             {
    34                 for(int j=0;j<m+2;j++)
    35                 {
    36                     if(g[i][j]=='1')
    37                     {
    38                         r[i]=j;
    39                         if(l[i]==0)  l[i]=j;
    40                     }
    41                 }
    42             }
    43         }
    44 
    45         for(int i=n;i>=1;i--)
    46         {
    47             if(l[i]==0 && r[i]==0)  n--;
    48             else break;
    49         }
    50 
    51         if(n==0)
    52         {
    53             puts("0");
    54             continue;
    55         }
    56 
    57         if(n==1)
    58         {
    59             printf("%d
    ",r[1]);
    60             continue;
    61         }
    62         
    63         memset(d,INF,sizeof(d));
    64         
    65         d[1][0]=2*r[1]+1;
    66         d[1][1]=m+1+1;
    67 
    68         for(int i=2;i<n;i++)
    69         {
    70             if(l[i]==0 && r[i]==0)
    71             {
    72                 d[i][0]=d[i-1][0]+1;
    73                 d[i][1]=d[i-1][1]+1;
    74             }
    75             else
    76             {
    77                 d[i][0]=min(d[i-1][0]+2*r[i],d[i-1][1]+m+1)+1;
    78                 d[i][1]=min(d[i-1][0]+m+1,d[i-1][1]+2*(m+1-l[i]))+1;
    79             }
    80         }
    81 
    82         int ans=min(d[n-1][0]+r[n],d[n-1][1]+m+1-l[n]);
    83 
    84         printf("%d
    ",ans);
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    无线电频谱和波段划分
    数字IC设计工程师推荐用书
    Verilog HDL 经典用书
    Interfacing Two Clock Domains
    值得借鉴的Perl学习总结
    MIMO技术原理、概念、现状简介
    cs0016:未能写入输出文件 "c:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"Temporary ASP.NET Files"root"...."*.dll“拒绝访问”
    Sql Server 2005 数据库备份还原后出现“受限制用户”问题的解决
    两个路由器连接的连接方法
    2个表之间复制数据
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6979182.html
Copyright © 2011-2022 走看看