第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
先说一下做这道题的思路吧:
其实当时做的时候真的是一点思路都没有,后来看了别人的博客才写出来的,比如说在样例的第一个例子里面,输入了6,2,实际上就是为了使得两个子序列全部都能够一样。,那么我们改变那个值比较好呢,其实这个时候我们就需要知道,你在这个位置有几个1,有几个2.如果1的位置比较多,那么我们就把少数不是1的改成1,这样我们就要建立3个数组了,来统计。此处也是别人点拨。
以下附上代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,k,sum,a[1000],i,j;//n表示要输入几个数字,k表示k是n的因子,且隔k个元素都是相等的,sum用来求至少需要改变的次数。
while(~scanf("%d %d",&n,&k))
{
int b[1001]={0};//b数组记录位置1的数的个数
int c[1001]={0};//c数组记录位置2的数的个数
x=n/k;//分成了x个序列
for(i=0;i<n;i++)
scanf("%d",&a[i]);//把原始所有数据都输入
for(i=0;i<k;i++)//其实就是每k个为一个循环类似的
{
for(j=0;j<x;j++)//其实就是相当于每个序列中有x个数
{
if(a[i+j*k]==1)
{
b[i]++;//只用统计k个数当中的数字为1的记录
}
else
{
c[i]++;//c数组记录该位置的数字为2的个数
}
}
}
sum=0;
for(i=0;i<k;i++)
{
if(b[i]<c[i]){
sum=sum+b[i];//加上小的那一块
}
else{
sum=sum+c[i];
}
}
printf("%d\n",sum);
}
return 0;
}