Description
农夫约翰的奶牛场有很多奶牛,奶牛有黑白两种颜色。现在奶牛们排成整齐的一列去参加镇上的游行活动。 约翰希望白色奶牛都排在前面,黑色的奶牛都排在后面。但现在队列中奶牛的颜色是混乱的,并且奶牛们都不愿意改变位置。 幸运的是,约翰有一根魔法棒,每挥舞一次魔法棒就可以改变一头奶牛的颜色。 请问,约翰至少要挥舞多少次魔法棒,才能将队列改成他希望的状态。注意,可以将所有的奶牛都变成白色,或者都变成黑色。
输入格式
第一行一个正整数n,表示奶牛的头数。(1<=n<=200000)。 第二行n个正整数,均为1或2,1表示白色奶牛,2表示黑色奶牛。
输出格式
一个正整数,表示挥舞魔法棒的最少次数。
输入样例
7 2 2 1 1 1 2 1
输出样例
3
提示
可以把1和2号奶牛变成1,7号奶牛变成2,或者全部奶牛变成1,最少需要3次。
先用一个数组来存储前面黑牛的个数,用另外一个数组来存储后面白牛的个数。(注意这里是以某一个数为界限,因为我们并不知道以哪一个数为界限可以的到最小值)
然后题目要求前面为白牛,后面为黑牛,使用挥棒次数等于前面黑牛数加上后面白牛数。最大的次数值设置为全部牛都被变为相反的,实际上这种情况是不存在的。
因此这道题的思路就是:
1.输入牛的总数n;
2.用一个数组来存储所有牛;
3.计算出不同情况下前面黑牛的数量;
for(i=0;i<n;i++) { b[i]=m; if(a[i]==2) m++; }
4.计算出不同情况下后面白牛的数量;
int w=0; for(i=n-1;i>=0;i--) { if(a[i]==1) w++; c[i]=w; }
5.根据以不同i为分界的情况,计算挥棒次数,找到挥棒次数最少的情况。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i,a[n],b[n]={0},c[n]={0};
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int m=0;
for(i=0;i<n;i++)
{
b[i]=m;
if(a[i]==2)
m++;
}
int w=0;
for(i=n-1;i>=0;i--)
{
if(a[i]==1)
w++;
c[i]=w;
}
int min=n;
for(i=0;i<n;i++)
{
if(c[i]+b[i]<min)
min=c[i]+b[i];
}
printf("%d",min);
return 0;
}