Problem J: 第K完美序列

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;
}

猜你喜欢

转载自blog.csdn.net/qq_42079027/article/details/81215818