Description
有一个由n个数字组成的序列,序列的每个数字不是1就是2。如果一个序列是第K完美序列,则这个序列满足以下两点;
1.k是n的因子。
2.这个序列中每隔k个元素都相等。
例如序列(1,2,1,2,1,2,1,2),不仅是一个第2完美序列而且又是一个第4完美序列。序列(1,1,1,1)是一个第1完美序列。
你的任务是给定一个由n个数字组成的序列,最少需要改变几个元素才能使这个序列变成一个第K完美序列。
Input
多组测试数据。
每组测试数据的第一行为两个正整数n,k(1<=k<=n<=100)。
第二行为n个由空格分隔的正整数代表这个序列。
Output
对于每组测试数据,输出最少需要改变的次数。
Sample Input
6 2
2 1 2 2 2 1
8 4
1 1 2 1 1 1 2 1
9 3
2 1 1 1 2 1 1 1 2
Sample Output
1 0 3
题意:
一个由1和2组成的n长度的序列,输入k,每隔k-1个数相等就是完美序列。问需要最少改变几次才能变成完美序列
分析:
最少改变的意思是:比如211121112.从a[0]开始隔2个数要相等,依次是a[0]=2 a[3]=1 a[6]=1.最少改变就需要改变a[0]=1.
211121112可以从a[0]开始隔两个,也可以从a[1],或a[2]开始隔两个。开始的位置可以从a【0】到a【k-1】
ac代码:
#include<stdio.h>
int a[101];
int main()
{
int m,n,i,j,k,sum;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sum=0;
for(j=0;j<k;j++) //开始的位置从0到k-1
{
int c=0,z=0;
for(i=j;i<n;i=i+k) //隔k个元素,遍历一遍数组
{
if(a[i]==1) c++; //记录1的个数
if(a[i]==2) z++; //记录2的个数
}
if(c>z) //1的个数大于2就要把不是1的改成1.
{
for(i=j;i<n;i=i+k)
if(a[i]==2) {a[i]=1;sum++;}//sum记录改的次数
}
if(z>=c)
{
for(i=j;i<n;i=i+k)
{
if(a[i]==1) {a[i]=2;sum++;}
}
}
}
if(k==0) printf("0");
else printf("%d\n",sum);
}return 0;
}