题目

源地址:

http://poj.org/problem?id=3048

理解

这不是我做过的最简单的题目,但一定是我做起来最逗比的题目。题意很明白,就是输出给定的数里面有最大值质因数的那个。题意中明确说明给定的数的范围是1到20000,然后我就开始机智了,20000的开方约为141,我只要打一个1到150以内所有素数的表,就OK啦~空间换时间,复杂度低得很。开开心心的敲完代码,结果WA了。看了一下discuss,针对一些特例微调了一下代码,结果还是WA。然后就进入坑爹模式,一坑就是一个下午。直到终于忍不住了,去问学长,学长看了一眼,说150到20000之间的质数呢?恍然大悟= =,没有考虑本身也是质数的情况,坑。

新技能get

  • 卡题过久时,应当毫不犹豫地放弃或者寻求帮助。
  • 不要执着于小数据特例而忘记大数据的测试,

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int p[4000], pNum = 0;
bool f[20001];
void Prime()
{
    int i, j;
    for (i = 2; i < 20001; i++)
    {
        if (!f[i])
        {
            p[pNum++] = i;
        }
        for (j = 0; j < pNum && i * p[j] < 20001; j++)
        {
            f[i * p[j]] = 1;
            if (!(i % p[j])) break;
        }
    }
}
int main()
{
    int i, n, t, mmax = -1, pos;
    scanf("%d", &n);
    Prime();
    while (n--)
    {
        scanf("%d", &t);
        if (t == 1)
        {
            if (mmax < 1)
            {
                mmax = 1;
                pos = 1;
            }
        }
        else
        {
            for (i = pNum - 1; i >= 0; i--)
            {
                if (t >= p[i] && t % p[i] == 0)
                {
                    if (mmax < p[i])
                    {
                        mmax = p[i];
                        pos = t;
                        break;
                    }
                }
            }
        }
    }
    printf("%d\n", pos);
}

更新日志

  • 2014年07月14日 已AC。