首页 > 其他分享 >Educational Codeforces Round 136 (Rated for Div. 2) E. Cleaning Robot

Educational Codeforces Round 136 (Rated for Div. 2) E. Cleaning Robot

时间:2022-09-30 19:34:47浏览次数:85  
标签:Educational Rated int 机器人 Codeforces 136 Div

Educational Codeforces Round 136 (Rated for Div. 2)  E. Cleaning Robot

Problem - E - Codeforces

题意:有一个二行n列的网格,有一些网格是脏的,扫地机器人起点在(1,1) 保证起点干净。

扫地机器人的的路线如下:每次去离他曼哈顿距离最近的脏的点,并使之干净。现在请问网格能留下最多多少个点,能使机器人一直工作完不冲突。

不冲突指:不存在两个脏的地方都是距离它曼哈顿距离最近的点。

 

 

题解:

首先显然机器人只会从左到右运行。

DP ,考虑状态 f(0/1,i)当前走到第0/1层的第i列时,所能收集到最多的1   (即脏地方)。

如果机器人在0行,一直往右走时,如果下方不是1,那么可以不用转移到下方,因为可以在后面某个下方为1的时候转移。

1、对立行不是1,f(j,i) j行i列,s[j^1][i] != 1   f(j,i+1) = f(j,i)+s[j][i+1]

2、对立行是1 ,  f(j,i) j行i列,s[j^1][i] == 1

那么分为两种情况 

1)右边不是1  则可以直接去到下方  f(j^1,i) = f(j,i) + s[j^1][j]  (注意这里要用变量存储更新,否则会循环dp,并且最后进行,因为2)是用原来的值  )

2)右边是1     则可以直接向右走,或者从对立行向右走2格子(因为一定不能走到右边的1)。

上面的f(i,j)的更新都是取max,最后取一个ans = max({ans,f[0][i],f[1][i]) ,我一般i喜欢取到n多一些,防止出错。

 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
int f[2][N],s[2][N];
char str[2][N];
int n;
void chkmax(int &u,int v){
    u = max(u,v);
}
int main(){
    // freopen("a.txt","r",stdin);
    scanf("%d",&n);
    scanf("%s%s",str[0]+1,str[1]+1);
    for(int i = 1;i<=n;++i){
        s[0][i] = str[0][i] - '0';
        s[1][i] = str[1][i] - '0';
    }
    memset(f,-0x3f,sizeof f);
    f[0][0] = 0;
    int ans = 0;
    for(int i = 0;i<=n+2;++i){
        
        if(s[1][i] == 1 && s[0][i+1] == 1){
            chkmax(f[1][i+2],f[0][i]+1+s[1][i+1]+s[1][i+2]);
        }
        if(s[0][i] == 1 && s[1][i+1] == 1){
            chkmax(f[0][i+2],f[1][i]+1+s[0][i+1]+s[0][i+2]);
        }
        int t0 = f[0][i],t1 = f[1][i];
        if(s[1][i] == 1 && s[0][i+1] == 0){
            chkmax(f[1][i],t0+1);
        }
        if(s[0][i] == 1 && s[1][i+1] == 0){
            chkmax(f[0][i],t1+1);
        }

        // 情况 1) 2) 的公共部分
        for(int j = 0;j<2;++j){
            chkmax(f[j][i+1],f[j][i]+s[j][i+1]);
        }
        chkmax(ans,max(f[0][i],f[1][i]));
        // cout<<i<<" "<<f[0][i]<<" "<<f[1][i]<<'\n';
    }
    printf("%d\n",ans);
    
    return 0;
}

 

标签:Educational,Rated,int,机器人,Codeforces,136,Div
From: https://www.cnblogs.com/wanghai673/p/16745905.html

相关文章

  • Codeforces Round #643 (Div. 2) ABD
    这套题目也太顶了,强推A-SequencewithDigitshttps://codeforces.com/contest/1355/problem/A题目大意:给定一个初始数值n,问我们在每次都加上这个数字的数位最大值*......
  • Educational Codeforces Round 136 C-D
    D.ResetKEdges显然对于每个k每个答案具有单调性我们考虑二分一个能保留的最大长度x然后我们自上至下肯定不好操作我们考虑自下而上对于每次到达了我们最大长度x......
  • Codeforces Round #822 (Div. 2)
    Preface这场间隔有点久了,ABC是上周日打的,DE是这周四写的感觉这场难度海星,比DE都不会的823友好多了A.SelectThreeSticks容易发现最终变成的长度一定是已经存在的,因......
  • *Codeforces Round #235 (Div. 2) C. Team(贪心)
    https://codeforces.com/contest/401/problem/C题目大意:给定n个0,m个1;让我们构建出一个字符串满足:不能连续2个以上的0,不能出现3个连续的1;可以的话就输出任意正确的结......
  • Codeforces Round #823 (Div. 2)
    B.MeetingontheLine题意:有n个人,第i个人的坐标是xi,从xi移动到yi要花|xi -yi|的时间。除此之外,他还需要ti 的时间打扮。试求一点使得所有人到这里所花时间的最大......
  • Educational Codeforces Round 135 (Rated for Div. 2) - E. Red-Black Pepper
    exgcdProblem-E-Codeforces题意给\(n\;(n<=3*10^5)\)个菜,每个菜可以加红辣椒或黑辣椒,分别可以获得\(c[i],d[i]\)分;有\(m\;(m<=3*10^5)\)个商店,第i个商店包......
  • Java使用ProtoBuffer3时报错: Cannot resolve method 'isStringEmpty' in 'GeneratedM
    错误描述我的机器是MacM1,项目中使用了ProtoBuffer3。使用protoc程序,根据proto文件生成了Java代码。在编译Java项目的时候,报错:cannotresolvemethod'isstringempty'in......
  • Codeforces Round #240 (Div. 1) B. Mashmokh and ACM(DP)
    https://codeforces.com/contest/414/problem/B题目大意:给定一个范围【1,k】,要求我们从这里面选出n个数字,并且满足任意两个相邻数字中后一个数字%前一个数字==0问我......
  • Codeforces Round #105 (Div. 2) D. Bag of mice
    CodeforcesRound#105(Div.2)翻译岛田小雅D.Bagofmice出题人Nickolas巨龙和公主在纠结大年夜应该干什么。巨龙想去山上看精灵们在月光下跳舞,但公主只想早点睡......
  • Codeforces Round #823 (Div. 2)(持续更新)
    Preface本来没准备打这场比赛的,因为昨天出去high玩了一整天才发现今天才发现晚上有CF,遂报名rush一发结果今天状态有点崩,先是B看错题导致浪费时间,然后又是D自己叉自己把原......