题解:AT_icpc2015summer_day4_a Where is the Boundary
Kratos_Charger · · 题解
AT_icpc2015summer_day4_a Where is the Boundary 题解
题目大意
给定 W 或 E),需要选择一个边界,使得在这个边界左边的县标记为 W 的数量与右边的县标记为 E 的数量之和最小。
思路
首先读取县的数量 W 的总数量。
对于每个可能的边界位置(即在每两个县之间的位置),分别计算左边的 W 数量和右边的 E 数量。
左边的 W 数量在遍历过程中会增加,而右边的 E 数量则会随着边界的变化而减少。
通过维护两个变量,分别记录当前左边的 W 数量和右边的 E 数量,并在每次边界移动时更新这两个数量。
在遍历所有边界位置时,记录最小的 W 数量加上右边的 E 数量之和,以及对应的边界位置。
最终输出最小值对应的边界位置即可。
Code
#include <bits/stdc++.h>
using namespace std;
int n,m,x=0,y=0;
int main() {
cin>>m>>n; // 输入县的数量和每个县的文化标记的长度
string s[n];
// 读取县的文化标记,并统计总的W数量
for(int i=0;i<n;i++) {
cin>>s[i];
for(int j=0;j<m;j++)
if(s[i][j]=='W')
y++; // 统计W的数量
}
int a=0,b=1; // 用于记录最佳边界的位置
int M=y; // 初始化最小错误数为总的W数量
// 遍历每个可能的边界
for(int j=0;j<m;j++) {
for(int i=0;i<n;i++)
s[i][j]=='W'?y--:x++; // 更新W和E的数量
// 计算当前边界的错误数量
if(x+y<M) {
M=x+y; // 更新最小错误数
a=j+1; // 记录边界位置
b=j+2; // 下一个边界位置
}
}
cout<<a<<" "<<b<<'\n'; // 输出结果
return 0;
}