前言:好家伙!今天又给我逮到一道可以做的题目,水水博客(数学规律题)
题目
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;
}
好家伙,今天要忙的事情太多了,写几道水题应付一下~~~