枚举每个位置,如果与这个位置为分界点,那么要修改多少个card。
#include<algorithm>
#include<iostream>
#include<stdio.h>
bool card[30002];//card[i]=0表示1,card[i]=1表示2;
int cow[30002][2];//cow[i]:表示1---i为1,i+1---n为2;cow[i][0],表示1---i要修改的卡片数,cow[i][1]:表示i+1要修改的卡片数。
int main()
{
int n,min=0,cn_1=0,cn_2=0;//cn_1表示n张卡片中1的个数,cn_2表示n张卡片中2的个数;
int i,x;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==1)
{
cn_1++;
card[i]=0;
}
else
card[i]=1;
}
cn_2=n-cn_1;
cow[0][0]=0;
cow[1][1]=cn_1;
cow[n][0]=cn_2;
cow[n+1][1]=0;
min=cn_1;
for(i=1;i<=n;i++)
if(card[i]==0)//若卡片上面是1,则1---i要修改的卡片数等于1---i-1要修改的卡片数,i+1---n要修改的卡片数,等于i--n要修改的卡片数-1
{
cow[i][0]=cow[i-1][0];
cow[i+1][1]=cow[i][1]-1;
}
else//若卡片上面是2,则1---i要修改的卡片数等于1---i-1要修改的卡片数+1,i+1---n要修改的卡片数,等于i--n要修改的卡片数
{
cow[i][0]=cow[i-1][0]+1;
cow[i+1][1]=cow[i][1];
}
for(i=0;i<=n;i++)
if(min>cow[i][0]+cow[i+1][1])
min=cow[i][0]+cow[i+1][1];
printf("%d/n",min);
return 0;
}