码蹄集 - MT1274 · 买马

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了码蹄集 - MT1274 · 买马相关的知识,希望对你有一定的参考价值。

传送门


买马

时间限制:1000 ms
空间限制:65535 KB


题目描述

在市场当中,每一个编号为i的马都住在相应编号为i的马厩中,现在小码哥想要在市场里购买一定数量的马匹,由于市场很大,小码哥可以买回编号非常大的马匹回来,但是小码哥的牧场并没有这么大,使得马匹住在相应编号的马厩中。但聪明的小码哥想到可以使用某种哈希映射来解决该问题。他想出的方法是对它们进行取模操作(即编号为si的马住在小码哥家编号为 si mod k的马厩里)。现在已经知道了买回来马匹的编号,你是否可以找到一个最小的k来完成此映射,使得每一匹马单独住在一个马厩中。(注意小码哥家有编号为0的马厩)


输入描述

第一行一个整数n表示小码哥买回来马匹的总数。(马的数量不超过100)
接下来n行,每一行一个数字si表示第i匹马的编号。(马的编号为不超过1000的正整数)


输出描述

一个整数,表示要求的最小的 K


样例一

输入

3
1
2
6

输出

3

题目分析

这道题大概意思就是:

给你 n n n 个数,其中第 i i i个数是 n i n_i ni

让你找到一个最小的正整数 a n s ans ans,使得 n i % a n s n_i \\% ans ni%ans 各不相同。

n n n的范围是 0 ∼ 100 0\\sim100 0100 n i n_i ni的范围是 0 ∼ 1000 0\\sim1000 01000,所以要找的 a n s ans ans一定 ≤ 1001 \\leq1001 1001

1 1 1开始暴力枚举 a n s ans ans即可,直到找到一个不冲突的 a n s ans ans就是答案。

AC代码

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
int a[111];  // 用来记录n匹马的编号
int main() 
    int n;
    cin >> n;
    fi (i, 0, n)  // for (int i = 0; i < n; i++)
        cd(a[i]);  // scanf("%d", &a[i]);
    int ans = 1;  // 从1开始尝试
    while (true) 
        set<int> appended;  // 已经出现过的
        for (int i = 0; i < n; i++) 
            if (appended.count(a[i] % ans))   // 如果已经出现过
                goto loop;
            
            appended.insert(a[i] % ans);  // 没有跳到loop,就说明之前还没有没有出现过。现在,他出现过了,所以要添加到appended中
        
        cout << ans << endl;  // n匹马全部遍历完了都没有冲突,ans就是答案
        break;
        loop:  // ans不可行的时候强制跳到这里
        ans++;
    
    return 0;

每周提前更新菁英班周赛题解,点关注,不迷路

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/124850224

以上是关于码蹄集 - MT1274 · 买马的主要内容,如果未能解决你的问题,请参考以下文章

码蹄集 - MT3111· 赋值

算法竞赛入门码蹄集新手村600题(MT1501-1550)

算法竞赛入门码蹄集新手村600题(MT1401-1450)

算法竞赛入门码蹄集新手村600题(MT1201-1250)

算法竞赛入门码蹄集新手村600题(MT1551-1600)

算法竞赛入门码蹄集新手村600题(MT1351-1400)