设为首页 加入收藏

TOP

POJ 1844 Sum[简单数学]
2014-11-23 18:53:36 来源: 作者: 【 】 浏览:5
Tags:POJ 1844 Sum 简单 数学

Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 9795 Accepted: 6406

Description

Consider the natural numbers from 1 to N. By associating to each number a sign (+ or -) and calculating the value of this expression we obtain a sum S. The problem is to determine for a given sum S the minimum number N for which we can obtain S by associating signs for all numbers between 1 to N.

For a given S, find out the minimum value N in order to obtain S according to the conditions of the problem.

Input

The only line contains in the first line a positive integer S (0< S <= 100000) which represents the sum to be obtained.
Output

The output will contain the minimum number N for which the sum S can be obtained.
Sample Input

12Sample Output

7Hint

The sum 12 can be obtained from at least 7 terms in the following way: 12 = -1+2+3+4+5+6-7.
Source

Romania OI 2002


思路:

算是很简单的数学题目了,但是昨天晚上就算几乎是推出了规律,居然都没有折腾出来太弱了。

然后完赛后在群里和 TeilWall 吐槽了下,就差泪奔了。。。


正解思路:


先定义 sum(i) = 1+2+...+i = (i+1)*i/2 【小学数学。。。(首项+末项)*项数/2 了解Orz】

可想而知 sum(i) 是 i 能确定的最大的数。


1.对于每一个输入的数 S ,我们找符合条件的 i 肯定是可以从 sum(i) >= S 开始枚举 i 的。

分析:如果连 sum(i) < S 那么 i 肯定是不符合条件的了。

PS:昨晚我在草稿纸上是逆推的,结果搞的很复杂,也没有注意到从 sum(i) >= S 这里开始枚举。。。


2. 当我们由第一步确定了 i 后有两种情况:

(1)Sum(i) == S ,那么很明显 i 就是答案,直接输出即可。

(2)Sum(i) > S , 从 i 开始,依次往后面 +1 枚举 ,只要遇到 (Sum(i) - S) % 2 == 0 输出答案就可以了。

其实 0%2 == 0 所以第一类情况实际上是可以归类于第二种情况的了。

分析:

情况一已经很明显了,下面主要分析情况二。。。

对于每一个 i 能够确定的数:

很明显最大的是 Sum(i) ,

然后再把序列 1,2,3,...i 中的 + 依次改成 - 那么能确定的下一个数一定比前一个数小二

比如说 i = 3, 那么能够确定的数是 6 ,4 ,2 ,(1)

i = 4, 能确定的数是 10, 8, (6)

i = 5, 能确定的数是 15,13,11,9,7,5, (3)

这里有一个问题:如何确定能确定的最后一个数在哪里截止, 如果减到后面遇的数已经被前面的数确定过,那么就不用往后

面减了,由于前面已经提到了,我们是从前面往后面枚举的 i 所以就不用考虑到哪里截止的问题了。

那么从这里可以看出:

对于一个数 i 它能确定的最大的数是 Sum(i),

如果对于当前的 i 它能够确定当前的 S ,那么 Sum(i)-S 一定是二的倍数。【(Sum(i)-S) % 2 == 0】


因为我们是从最小的可能满足条件的 i 开始枚举的,所以不会出现前面的 i 满足条件而小于当前的 i 的情况。

也就是说一旦遇到了 (Sum(i)-S)%2 == 0 输出 i 就可以了。


我比赛时的想法分析:


当时我已经在草稿纸上画出了下面的东东了。。。


但是我居然是逆推的,同时没想过枚举。。。而且这么明显的结论也没有看出来,然后我就推出了下面的复杂而傻逼的公式。。。


如果结尾的数 N 是偶数:

那么 N 可以确定的数是从 (1+N)*N/2 开始 依次减二 直到大于 (1+ N-1)*(N-1)/2 为止

如果结尾的数 N 是奇数:

那么 N 可以确定的数是从 (1+N)*N/2 开始 依次减二 知道大于 (1+ N-2)*(N-2)/2 为止

。。。。

然后实在是无法逆推出直接的公式了,也想到过枚举,但是开始没想到枚举的区间从哪里开始

然后看做这题无望,时间已经过去了大半,就果断去写了前面简单的贪心。。。一直自认为关于找规律还是很在行的了,结果还是坑在了这题上。

code:

#include

const int maxn = 100000;

int main()
{
    int s;
    while(scanf("%d", &s) != EOF)
    {
        int sum = 0;
        int i;
        for(i = 1; i < maxn; i++) //先找到和 <= 自己的最小的数
        {
            sum = (1+i)*i/2;
            if(sum >= s) break;
        }
        int index = i; //记录

        for(;;)
        {
            sum = (1+index)*index/2;
            if((sum-s)%2 == 0) //往后面找, 只要找到就输出
            {
                printf("%d\n", index);
                break;
            }
            index++;
        }
    }
    return 0;
}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1056 IMMEDIATE DECODABILITY.. 下一篇[CF 276C]Little Girl and Maximu..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)
·神仙级python入门教 (2025-12-26 12:00:46)
·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)