POJ-2769-Reduced ID Numbers 解题报告

       同余的应用,哈希。题意:给你G个学生的编号,编号为0~10^6的整数,请你找出最小的正整数m使得所有学生的编号对与模m不同余。


       我的解题思路:从小到大枚举m然后哈希判断是否都不同余。我想到了一个小小的优化就是如果有n个学生的话,那么最小的正整数m至少是n,这个思想是基于容斥原理的。但是还是TLE了,最后看了讨论版才知道memset的优化,只memset用过的部分。优化后从TLE到200ms左右,题目的时间限制是2000ms......


       我的解题代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>

using namespace std;

const int N = 1000001;

int n;
int num[N];
bool vis[N];

void InitRead();

void DataProcess();

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        InitRead();
        DataProcess();
    }
    return 0;
}

void InitRead()
{
    scanf("%d", &n);
    for (int i=0; i<n; ++i)
    {
        scanf("%d", &num[i]);
    }
    return;
}

void DataProcess()
{
    int ans = n;
    while (true)
    {
        bool find = true;
        memset(vis, false, ans*sizeof(vis[0])); //关键优化,没有就超时,有的话就200ms左右
        for (int i=0; i<n; ++i)
        {
            if (vis[num[i] % ans])
            {
                find = false;
                break;
            }
            vis[num[i] % ans] = true;
        }
        if (find) break;
        ++ans;
    }
    printf("%d\n", ans);
    return;
}


猜你喜欢

转载自blog.csdn.net/JZQT_T/article/details/44702545