This task will exclusively concentrate only on the arrays where all elements equal 1 and/or 2.
Array a is k-period if its length is divisible by k and there is such array b of length k, that a is represented by array b written exactly times consecutively. In other words, array a is k-periodic, if it has period of length k.
For example, any array is n-periodic, where n is the array length. Array [2, 1, 2, 1, 2, 1] is at the same time 2-periodic and 6-periodic and array [1, 2, 1, 1, 2, 1, 1, 2, 1] is at the same time 3-periodic and 9-periodic.
For the given array a, consisting only of numbers one and two, find the minimum number of elements to change to make the array k-periodic. If the array already is k-periodic, then the required value equals 0.
The first line of the input contains a pair of integers n, k (1 ≤ k ≤ n ≤ 100), where n is the length of the array and the value n is divisible by k. The second line contains the sequence of elements of the given array a1, a2, ..., an (1 ≤ ai ≤ 2), ai is the i-th element of the array.
Print the minimum number of array elements we need to change to make the array k-periodic. If the array already is k-periodic, then print0.
6 2 2 1 2 2 2 1
1
8 4 1 1 2 1 1 1 2 1
0
9 3 2 1 1 1 2 1 1 1 2
3
In the first sample it is enough to change the fourth element from 2 to 1, then the array changes to [2, 1, 2, 1, 2, 1].
In the second sample, the given array already is 4-periodic.
In the third sample it is enough to replace each occurrence of number two by number one. In this case the array will look as [1, 1, 1, 1, 1, 1, 1, 1, 1] — this array is simultaneously 1-, 3- and 9-periodic.
#include <stdio.h>
int main(void){
int n, k;
char s[105];
while(scanf("%d%d",&n, &k)!=EOF){
char str[105][105] = {'0'};
int count1[105] = {0};
int count2[105] = {0};
int count = 0;
getchar ();
for (int i=0; i<n/k; i++){
for (int j=0; j<k; j++){
scanf("%c",&str[i][j]);
getchar ();
}
}
for (int i=0; i<n/k; i++){
for (int j=0; j<k; j++){
if(str[i][j]=='1')
count1[j]++;
else count2[j]++;
}
}
for (int i=0; i<k; i++)
if(count1[i]>count2[i])
s[i] = '1';
else s[i] = '2';
s[k] = '\0';
for (int i=0; i<n/k; i++)
for (int j=0; j<k; j++)
if(str[i][j]==s[j])
count++;
printf("%d\n",count);
}
}
刚刚又看了下大神的代码。。。不得不佩服人家代码的简洁
#include<stdio.h>
int min(int a,int b){
return a>b?b:a;
}
int a[105];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)+1)
{
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int ans=0;
for(int i=0;i<k;i++)//判别k次
{
int cnt=0;
for(int j=i;j<n;j+=k)//判断对应列
{
if(a[j]==1) cnt++;
}
ans+=min(cnt,n/k-cnt);//cnt表示1的个数,n/k-cnt表示2的个数,取其中较小值
}
printf("%d\n",ans);
}
return 0;
}