ZCMU-1305: 第K完美序列

前言:好家伙!今天又给我逮到一道可以做的题目,水水博客(数学规律题)

题目

1305: 第K完美序列

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 271 Solved: 149
[Submit][Status][Web Board]
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

思想

这道题目看完题目其实就是找规律。n个数k个一循环,其实我们可以把数据切成n/k块,然后每块k的数据。跑第一块的遍历,统计和后面的块相同位置的相同数和不同数,然后把小的加到sum内

AC代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
const double PI = acos(-1);
const int maxn = 105;
typedef long long ll;
int a[maxn];
int main()
{
    
    
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
    
    
        memset(a, 0, sizeof a);
        for(int i=0;i<n;++i)scanf("%d",&a[i]);
        int same,dif;
 
        int sum = 0;
        for(int i=0;i<k;i++){
    
    
            same = dif = 0;
        for(int j=0;j<n/k;++j)
        {
    
    
            if(a[i]==a[i+j*k])same++;
            else dif ++;
        }
            sum += min(same,dif);
        }
        printf("%d\n",sum);
    }
    return 0;
}


好家伙,今天要忙的事情太多了,写几道水题应付一下~~~

猜你喜欢

转载自blog.csdn.net/DAVID3A/article/details/115017316