ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Educational Codeforces Round 128 (Rated for Div. 2)

2022-05-14 11:03:56  阅读:156  来源: 互联网

标签:Educational Rated int scanf Codeforces long 网格 物品 移动


D

鸽.....

E

给一个2*n的网格,一些(至少一个)网格上面存在一个物品,当两个物品移动到同一个网格的时候变成一个
每次可以移动一个物品,求移动的最小次数
首先求出存在物品的列区间为[l, r]
显然存在,不会将物品移动到[l, r]之外
在[l, r]之间做dp
f[i][0]:表示从l列移动到第i列,并且停在了第一行
f[i][1]:表示从l列移动到第i列,并且停在了第二行
状态转移:根据第i列物品的状态以及第i-1停在了哪一行,很容易进行状态
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 2e6 + 10;
char a[N], b[N];
int f[N][2];
int n;

int main(){
    int T; cin >> T;
    while(T--){
        scanf("%d", &n);
        scanf("%s", a + 1);
        scanf("%s", b + 1);
        int l = 2e9, r = 0;
        for(int i = 1; i <=n; i ++){
            if(a[i] == '*' || b[i] == '*') l = min(l, i), r = max(r, i);
        }
        // 初始化
        if(a[l] == '*' && b[l] == '*') f[l][0] = 1, f[l][1] = 1;
        else if(a[l] == '*') f[l][0] = 0, f[l][1] = 1;
        else if(b[l] == '*') f[l][0] = 1, f[l][1] = 0;

        // 状态转移
        for(int i = l + 1; i <= r; i ++){
            if(a[i] == '*' && b[i] == '*'){
                f[i][0] = min(f[i - 1][0] + 2, f[i - 1][1] + 2);
                f[i][1] = min(f[i - 1][0] + 2, f[i - 1][1] + 2);
            }
            else if(a[i] == '*' && b[i] != '*'){
                f[i][0] = min(f[i - 1][0] + 1, f[i - 1][1] + 2);
                f[i][1] = min(f[i - 1][0] + 2, f[i - 1][1] + 2);
            }
            else if(a[i] != '*' && b[i] == '*'){
                f[i][0] = min(f[i - 1][0] + 2, f[i - 1][1] + 2);
                f[i][1] = min(f[i - 1][0] + 2, f[i - 1][1] + 1);
            }
            else{
                f[i][0] = min(f[i - 1][0] + 1, f[i - 1][1] + 2);
                f[i][1] = min(f[i - 1][1] + 1, f[i - 1][0] + 2);
            }
        }
        cout << min(f[r][0], f[r][1]) << endl;
    }
    return 0;
}

标签:Educational,Rated,int,scanf,Codeforces,long,网格,物品,移动
来源: https://www.cnblogs.com/njw1123/p/16269342.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有