AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

小曲的棋盘

作者: 作者的头像   馀_8 ,  2024-05-17 21:41:00 ,  所有人可见 ,  阅读 9


0


链接:https://ac.nowcoder.com/acm/contest/77127/C
来源:牛客网

只要一个由
𝑁
×
𝑀
N×M 个小方块组成的棋盘符合如下规则,就是小曲喜欢的棋盘。

  • 从最上方若干行(至少一行)的格子全部是白色的;
  • 接下来若干行(至少一行)的格子全部是蓝色的;
  • 剩下的行(至少一行)全部是红色的;

现有一个棋盘状的布,分成了
𝑁
N 行
𝑀
M 列的格子,每个格子是白色蓝色红色之一。小曲希望把这个布改成她喜欢的样子,方法是在一些格子上涂颜料,盖住之前的颜色。

小曲很懒,希望涂最少的格子,使这个棋盘成为她喜欢的棋盘。
输入描述:
输入共
𝑁
+
1
N+1 行。

第一行是两个整数
𝑁
,
𝑀
N,M。

接下来
𝑁
N 行是一个矩阵,矩阵的每一个小方块是W(白),B(蓝),R(红)中的一个。
输出描述:
一个整数,表示至少需要涂多少块。
示例1
输入
复制
4 5
WRWRW
BWRWB
WRWRW
RWBWR
输出
复制
11
说明
目标状态是

WWWWW
BBBBB
RRRRR
RRRRR

一共需要改
11
11 个格子。
备注:
对于
70
%
70% 的数据,
𝑁
,
𝑀
≤
50
N,M≤50,且
min
⁡
{
𝑁
,
𝑀
}
≥
3
min{N,M}≥3。

对于
100
%
100% 的数据,
𝑁
,
𝑀
≤
2000
N,M≤2000,且
min
⁡
{
𝑁
,
𝑀
}
≥
3
min{N,M}≥3。

思路:分别记录要将某一行全部换为某一颜色所需的次数,枚举蓝色第一行与最后一行的位置利用
前缀和计算后取最小值即可。

include[HTML_REMOVED]

using namespace std;
const int N=2010;
int w[N],b[N],r[N];
char s;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i)
{
for(int j=1;j<=m;j
)
{
cin>>s;
if(s!=’W’) w[i];
if(s!=’B’) b[i]
;
if(s!=’R’) r[i];
}
}
for(int i=1;i<=n;i
)
{
w[i]+=w[i-1];
b[i]+=b[i-1];
r[i]+=r[i-1];
}
int ans=1e9+10;
for(int i=2;i<n;i)
{
for(int j=i;j<n;j
)//j=i
{
ans=min(ans,w[i-1]+b[j]-b[i-1]+r[n]-r[j]);
}
}
cout<<ans<<endl;
return 0;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息