PINコードのCodeForces - 1263B

PINコードは正確に4桁の数字から成る文字列です。可能なPINコードの例:7013、0000と0990.くださいノートPINコードでも0で、任意の数字で始めることができます。

polycarpが有するn個(2≤n≤10)銀行カード、i番目のカードのPINコードは、PIです。

polycarpは最近、別のカードに異なるPINコードを設定した方がよいという勧告を読みました。こうして彼は、すべてのn個のコードが異なるとなるように、彼のカードのPINコードの桁の最小数を変更したいです。

正式に、一の工程で、のpolycarpは、i番目のカード(1≤i≤n)、そのPINコードPIを一つ選択位置(1​​〜4)ピック、および任意の他のこの位置に数字を変更します。彼はすべてのPINコードが異なるとなるような最小桁数を変更する必要があります。

polycarpはすぐにこの問題を解決しました。あなたはそれを解決することはできますか?

入力
入力のテストケースの数-最初の行は整数T(1≤t≤100)を含みます。そして、テストケースは以下の通り。

polycarpの銀行カードの数 - t検定セットのそれぞれの最初の行は、単一の整数n(2≤n≤10)を含みます。1行に1つずつ - 次のn行は、PINコードのP1、P2、...、PNが含まれています。それらのそれぞれの長さは4すべてのPINコードは数字のみで構成されています。

出力は、
t検定セットに対する回答を印刷します。各セットに対する答えは、n + 1行から成るべきです

第一のライン印刷Kに - 変化の最小数は、全てのPINコードが異なるようにします。次のn行の出力に入力におけるそれらの出現に対応するためにPINコードを変更しました。いくつかの最適な答えがある場合は、それらのいずれかを印刷します。

例えば
入力
3
2
1234
0600
2
1337
1337
4
3139
3139
3139
3139
出力
0
1234
0600
1
1337
1237
3
3139
3138
3939
6139

タイトルの意味:
PINコードは4桁のコードを指します。あなたはN PINコードを使用すると、すべてのPINコードが異なるように操作の最小数を必要とし、変更桁のPINコードを動作させることができ、すべての時間を持っています。
アイデア:
それにはそこではありませんでしたそのうちの一つ修正、変更、その中に何の数字列挙。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int p[10] = {0,1,10,100,1000};

int b[10005],vis[10005];
int n;

int modify(int x,int y,int z)//x的第y位改为z.
{
    int num = x / p[y] % 10;
    x -= p[y] * num;
    x += p[y] * z;
    return x;
}

int solve()
{
    int ans = 0;
    for(int i = 1;i <= n;i++)
    {
        int flag = 0;
        if(vis[b[i]] > 1)
        {
            for(int j = 1;j <= 4;j++)
            {
                for(int k = 0;k <= 9;k++)
                {
                    int tmp = modify(b[i],j,k);
                    if(vis[tmp]==0)
                    {
                        ans++;
                        vis[tmp]++;
                        vis[b[i]]--;
                        b[i] = tmp;
                        flag = 1;
                        break;
                    }
                }
                if(flag)break;
            }
        }
    }
    return ans;
}

int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d",&n);
        for(int i = 1;i <= n;i++)
        {
            scanf("%d",&b[i]);
            vis[b[i]]++;
        }
        int ans = solve();
        printf("%d\n",ans);
        for(int i = 1;i <= n;i++)printf("%04d\n",b[i]);
    }
    return 0;
}
公開された676元の記事 ウォン称賛18 ビュー30000 +

おすすめ

転載: blog.csdn.net/tomjobs/article/details/104124827