题目链接:
题目意思:给出n和k和一个只有1或者2组成的序列,需要求出最少的改变次数,使得 n/k 组里面的数完全相等。如果该序列n/k组里面的数本来已经全部相等,输出0。
我的做法是,在这个序列中,找出n/k对应位置的数,统计1和0的个数。以第一组数据样例来说(n/k = 3组数,每组数用 "|" 隔开),
序号i : 1 2 | 3 4 | 5 6
对应的序列: 2 1 | 2 2 | 2 1
即分别统计1、3、5和2、4、6对应的2和1的个数,如果2的个数比较多,就把1的个数全部变为2,反之把2的个数转换成1(2、4、6的情况:cnt1= 1 ,cnt2 = 2,把1换成2,一次即可),这样能保证每次转换用的都是最少的次数,构造出的最终结果也是最少的。特别要注意,如果1的个数或者2的个数为0,此时不需要转换!
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 100 + 5; 8 int a[maxn]; 9 int c[3];10 11 int main()12 {13 int n, k, i, j, sum;14 while (scanf("%d%d", &n, &k) != EOF)15 {16 for (i = 1; i <= n; i++)17 scanf("%d", &a[i]);18 sum = 0;19 for (j = 1; j <= k; j++)20 {21 memset(c, 0, sizeof(c));22 c[a[j]] = 1; // 第一组数的每个数直接赋为123 for (i = j+k; i <= n; i += k) // 每组数统计对应位置1和2的个数24 c[a[i]]++;25 if (c[1] == 0 || c[2] == 0)26 sum += 0;27 else if (c[1] < c[2])28 sum += c[1];29 else 30 sum += c[2];31 }32 printf("%d\n", sum);33 }34 return 0;35 }