现在的位置: 首页 > 综合 > 正文

HOJ 12983 Integer Estate Agent(搜索优化)

2019年02月12日 ⁄ 综合 ⁄ 共 759字 ⁄ 字号 评论关闭

题意是说给你一个数n,它可能是一些连续的整数串的和(整数最小是2),求对于每一个n,这样的串有多少个。

太年轻了,对于每一个n都去枚举串的长度,一直TLE,做了读入优化,记忆化搜索也不管用,后来看了另外一个妹子的代码才发现,应该先打一次表,但是姿势略有不同。先枚举串的长度,接着枚举串的起始点,然后用公式计算出值,在合法范围内就给该位置加一。对于每一个内循环,值超过最大值就跳出。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

const int maxn = 1e6 + 10;
int ans[maxn];

template <class T>
char scanf(T *argu)
{
    char ch = getchar();
    (*argu) = 0;
    while(ch > '9' || ch < '0')
    {
        if(ch == EOF)
            return ch;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        (*argu) *= 10;
        (*argu) += ch - '0';
        ch = getchar();
    }
    return ch;
}

void init()
{
	memset(ans, 0, sizeof(ans));
	int mt = 2 * sqrt(maxn) + 1;
	long long sum;
	for(int t = 1; t < mt; t++)
	{
		for(int x = 1; x < maxn; x++)
		{
			sum = x * t + t * (t + 1) / 2;
			if(sum > 1e6)
				break;
			else
				ans[sum]++;
		}
	}
}

int main()
{
    int n;
    init();
    while(scanf(&n) && n)
        printf("%d\n", ans[n]);
    return 0;
}

抱歉!评论已关闭.