今天的有点难。。。。。
没做几道题。。。。
问题 A: 战马列队
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
马年到了,也到了检阅战马的时候。战马分为白色和棕色两种,一字排开,指挥官希望他的战马队列尽可能整齐好看,将相同颜色的战马放在一起。
大部分人都喜欢高头白马,因此,指挥官要求白马排在前面,棕马排在后面。现在,N匹战马都已经在广场列队。为了达到要求,指挥官可以调换任意一个位置上的战马(有充足的备用战马)。问至少调换多少匹可以达到要求。
输入
第一行一个整数N,表示已经排队的战马数量。
第二行一个字符串,表示当前队列从前到后战马的颜色,只包含两种字符,"W"表示白马,"B"表示黑马。
输出
输出一个数字,表示至少需要调换多少匹战马。
样例输入 Copy
5 WWWBB
样例输出 Copy
0
提示
30%的数据N<=20。
70%的数据N<=500。
100%的数据N<=1000。
题意理解:
样例:WWBBW 答案为1
WWBBW—>WWBBB // WWBBW—>WWWWW
选取第一种方案比较优;
代码思路:
①要么全为同色,要么前w后b;
②开始思考的是分类,结果根本不可行。。。。
③那就按照单调那种思路。。
。
④递推。。。。。
字符序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
str[1005] | W | W | W | B | B | B | B | B | B | W |
数组序号 i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
w[1005] | 1 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 |
b[1005] | 6 | 6 | 6 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ans=min(w[n],b[1]);//这个指的同色。。。
ans=min(ans,i-w[i]+n-i-b[i+1]);//这个就指的前W后B
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int w[1005],b[1005];
//递推思想
int main()
{
int n;
scanf("%d",&n);
char str[1005];
scanf("%s",str);
for(int i=1;i<=n;i++)
{
if(str[i-1]=='W') w[i]=w[i-1]+1;
else w[i]=w[i-1];//单调最长
}
int ans=0;
for(int i=n;i>=1;i--)
{
if(str[i-1]=='B') b[i]=b[i+1]+1;
else b[i]=b[i+1];
ans=min(w[n],b[1]);
}
for(int i=1;i<n;i++)
{
ans=min(ans,i-w[i]+n-i-b[i+1]);
}
printf("%d",ans);
return 0;
}
/**************************************************************
Problem: 11648
User: 2019UPC110
Language: C++
Result: 正确
Time:1 ms
Memory:2032 kb
****************************************************************/