ZCMU-1305:K番目の完全なシーケンス

はじめに:いいやつ!今日、私にできるもう一つの質問、修水ブログ(数学法の質問)を見つけました。

トピック

1305:K番目の完全なシーケンス

時間制限:1秒メモリ制限:128 MB
送信:271解決済み:149
[送信] [ステータス] [Webボード]
説明

n個の数字のシーケンスがあり、シーケンス内の各数字は1または2のいずれかです。シーケンスがK番目の完全なシーケンスである場合、このシーケンスは次の2つの点を満たし
ます。1。kはnの因数です。
2.このシーケンスのすべてのk要素は等しい。
たとえば、シーケンス(1,2,1,2,1,2,1,2)は、2番目の完全なシーケンスであるだけでなく、4番目の完全なシーケンスでもあります。シーケンス(1,1,1,1)は最初の完全なシーケンスです。
あなたの仕事はn個の数からなるシーケンスを与えることであり、このシーケンスをK番目の完全なシーケンスにするために少なくともいくつかの要素を変更する必要があります。

入力

テストデータの複数のセット。
テストデータの各グループの最初の行は、2つの正の整数n、k(1 <= k <= n <= 100)です。
2行目は、スペースで区切られたn個の正の整数でこのシーケンスを表しています。

出力

テストデータのセットごとに、変更が必要な変更の最小数を出力します。

サンプル入力

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

サンプル出力

1
0
3

思想

このトピックを読んだ後、それは実際にパターンを見つけることです。実際、N個のkサイクルでは、データをn / kブロックに分割し、次にkデータの各ブロックに分割できます。最初のブロックのトラバーサルを実行し、次のブロックと同じ位置で同じ数と異なる数を数え、次に小さいものを合計に追加します

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