#417(div2) B - Sagheer, the Hausmeister

题意:输入n,m,代表n层楼,每层有m个房间,左右都有2个楼梯且为0,我们最开始在左下,如果当前楼层没1,那么可以直接向上走,也可以走过去然后走回来,也可以一直走,但向上只能在最左或者最右,问把所有1变成0,要多久,移动一个花费1.

思路:我们可以记录每一层最左边和最右边的1在哪个位置,当前在左边楼梯判断是走到最右边短,还是走到最右边那个1+往回走短;当前在右边楼梯同理。最上面一层需特别处理,我只要走到最后一个1那里就行,没必要走到楼梯那里,还有最上面几层没1

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 char a[20][105];
 5 int dp[20][105];
 6 int b[20];
 7 int c[20];
 8
 9 int main(){
10     int n,m;
11     scanf("%d%d",&n,&m);
12     m=m+2;
13     for(int i=1;i<=n;i++)
14         scanf("%s",a[i]+1);
15     for(int i=1;i<=n;i++)
16         for(int j=m;j>=1;j--)
17         if(a[i][j]==‘1‘) {
18             b[i]=j;break;
19         }
20     for(int i=1;i<=n;i++)
21     for(int j=1;j<=m;j++){
22         if(a[i][j]==‘1‘){
23              c[i]=j;break;
24         }
25     }
26     if(b[n]==0) {
27         dp[n][1]=1;dp[n][m]=1;
28     }
29     else {
30         dp[n][1]=b[n]+b[n]-1;
31         dp[n][m]=m;
32     }
33    // cout<<dp[n][1]<<" "<<dp[n][m]<<endl;
34     for(int i=n-1;i>=2;i--){
35         dp[i][1]=dp[i+1][1]+1;
36         dp[i][m]=dp[i+1][m]+1;
37         if(b[i]==0) continue;
38         int l=dp[i][1];
39         int r=dp[i][m];
40         dp[i][m]=min(l+m-1,r+m-c[i]+m-c[i]);
41         dp[i][1]=min(r+m-1,l+b[i]*2-2);
42     }
43         dp[1][1]=dp[2][1]+1;
44         dp[1][m]=dp[2][m]+1;
45         if(b[1]!=0&&n!=1){
46              cout<<min(dp[1][1]+b[1]-1-1,dp[1][m]+m-c[1]-1)<<endl;return 0;
47         }
48         for(int i=1;i<n-1;i++){
49             if(b[i]==0&&b[i+1]!=0){
50                 dp[i+1][1]=dp[i+2][1]+1;
51                 dp[i+1][m]=dp[i+2][m]+1;
52                // cout<<i<<endl;
53                 cout<<min(dp[i+1][1]+b[i+1]-1-1,dp[i+1][m]+m-c[i+1]-1)<<endl;
54                 return 0;
55             }
56         }
57     if(b[n]==0)
58     cout<<0<<endl;
59     else
60         cout<<b[n]-1<<endl;
61     return 0;
62 }
时间: 2024-10-16 19:02:43

#417(div2) B - Sagheer, the Hausmeister的相关文章

#417(div2) C. Sagheer and Nubian Market

题意:给出n件商品价格和一个最大限额S,购买时商品的价格变为axj?+?xj·k,xj是下标索引,k是购买数量,求最多能买几件和花费. 思路:二分+排序 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll a[100005]; 6 ll b[100005]; 7 ll n,s; 8 ll sum; 9 ll check(ll x){ 10 sum=0; 11 for(int i=1;i&

#417(div2) A. Sagheer and Crossroads

题意:4个路口,左拐,向前,右拐,行人的四种状态,1代表绿灯,0代表红灯,也就是1车可以走,人也可以走,发生事故输出YES,否则NO. 思路:瞎搞 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int l[5],s[5],r[5],p[5]; 6 for(int i=1;i<=4;i++){ 7 scanf("%d%d%d%d",&l[i],&s[i],&r

Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister(DP)

题目链接:Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister 题意: 有n层楼,每层有m个房间,每层的两边是楼梯. 现在有一个人站在左下角,这个人必须将这一层的灯关闭后才能去另外一层. 每移动一次需要1分钟,问关闭所有灯需要多少时间. 题解: 考虑DP[i][j]表示当前已经关闭了第i层全部的灯,j=0时表示在这一层的最左边,j=1时表示在这一层的最右边. 然后推上去就行了.最后讨论一下特殊情况. 1 #include<bits/

cf386(div2)大一狗ACM之路

#cf386(div2)总结#前两题很顺利的做了出来, c题扔了, D题wrong了5发才A掉.A题签到题, 但是想多了, 代码写的有点长了. 找被整除最小值*7.B题 读题读了一会, 读完了就有思路了, 1A. 字符串问题, 从后往前两个两个的放到新的字符串里, 一个从最左, 一个从最右, 模拟指针扫着放, 最后特判会不会扫到一起.C题跳了没看, 最后做完了D题回来看了一眼没什么思路 日后再说.D题, 恩.. 两个多小时都用在这题上面了, 20分钟的时候做完了B之后就一直再啃D题, 暴力判断啊

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟 枚举

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟  枚举 题意 一个红绿灯 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道让你判断,汽车是否有可能撞到行人 注意 当前车道的左转有可能撞到别的车道的行人的 题解 一大堆特判 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring&g

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序 题意 有 a[ i ] 个数 要求选最多的数 使其和不超过 S ,且在此情况下,和最小选最多数情况下 和最小 且 每个数有加成 如果选了 k个数 那么加成后 就是 a[ i ] + k*i ; 题解 二分mid 表示选了个数 加成一下,将加成以后结果排序一下 , 若前 mid数 和大于 s 则此方案不可行 PS 要用 long long ..... 还有 co

AC日记——Sagheer, the Hausmeister codeforces 812b

812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 20 #define maxm 105 #define INF 0x7fffffff int n,m,deep[maxn][2],num[maxn],

CF #262 (DIV2) C . Present (二分答案)

output standard output Little beaver is a beginner programmer, so informatics is his favorite subject. Soon his informatics teacher is going to have a birthday and the beaver has decided to prepare a present for her. He planted n flowers in a row on

Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree(树上Nim)

题目链接:Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree 题意: 给你一棵树,每个节点有a[i]个苹果,有两个人要在这个树上玩游戏. 两个人轮流操作,谁不能操作谁就输了. 这个树有一个特性:叶子到根的距离的奇偶性相同. 每次操作可以选一个节点i,和一个数x,x小于当前节点i的苹果数. 对于节点i,如果是叶子节点,就将这x个苹果吃掉. 如果是非叶子节点,就将这x个苹果移向节点i的任意儿子节点. 现在第二个操作的人要交换两个节点的苹果