链接:



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

12

Sample Output

7

Hint

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

Source

思路:

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

然后完赛后在群里和 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<stdio.h>

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 1844 Sum【简单数学】的更多相关文章

  1. OpenJudge/Poj 1844 Sum

    1.链接地址: http://bailian.openjudge.cn/practice/1844 http://poj.org/problem?id=1844 2.题目: Sum Time Limi ...

  2. POJ 1844 Sum

    题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k. 解法:一开始觉得dp……后来觉得复杂度太大了……GG……百度了一下是个数学题orz. 如果n全部由加法组成,那么k可以组成k(k+ ...

  3. ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法

    POJ 2739 Sum of Consecutive Prime Numbers Time Limit:1000MS     Memory Limit:65536KB     64bit IO Fo ...

  4. HDU 5073 Galaxy (2014 Anshan D简单数学)

    HDU 5073 Galaxy (2014 Anshan D简单数学) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5073 Description G ...

  5. 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数

    洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...

  6. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  7. 洛谷试炼场-简单数学问题-P1088 火星人

    洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...

  8. POJ.2739 Sum of Consecutive Prime Numbers(水)

    POJ.2739 Sum of Consecutive Prime Numbers(水) 代码总览 #include <cstdio> #include <cstring> # ...

  9. POJ 2739 Sum of Consecutive Prime Numbers(素数)

    POJ 2739 Sum of Consecutive Prime Numbers(素数) http://poj.org/problem? id=2739 题意: 给你一个10000以内的自然数X.然 ...

随机推荐

  1. CentOS 7 Docker

    安装docker yum install docker 查看docker docker version 这是因为docker还没有运行,需要启动docker 启动docker systemctl st ...

  2. Struts2自定义转换器输入生日日期输出年、月、日、年龄

    BirthAction.java package com.action; import java.util.Calendar; import java.util.Map; import com.bea ...

  3. Poj2482 Stars in Your Window(扫描线)

    题面 Poj 题解 下面内容引用自"李煜东 <算法竞赛进阶指南>"(对原文略有缩减,侵删): 因为矩形的大小固定,所以矩形可以由它的任意一个顶点唯一确定.我们可以考虑把 ...

  4. AspNet5 Changes to [Activate] in beta-5

    最近在看AspNet Core相关的文章,其中有个TagHelper,看上善若水的博客“关于TagHelper的那些事”,其中有一句 下面来自上善若水的博客原文: 我们知道ASP.NET 5实现了依赖 ...

  5. noip 2016 day2 t1组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  6. BZOJ 3632 外太空旅行(最大团)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3632 [题目大意] 求图中的最大团. [题解] 最大团问题是npc问题,因此可以考虑随 ...

  7. 【模拟退火】Petrozavodsk Winter Training Camp 2017 Day 1: Jagiellonian U Contest, Monday, January 30, 2017 Problem F. Factory

    让你在平面上取一个点,使得其到给定的所有点的距离和最小. 就是“费马点”. 模拟退火……日后学习一下,这是从网上扒的,先存下. #include<iostream> #include< ...

  8. 【动态规划】CDOJ1692 这是一道比CCCC简单题更有想象力的中档题

    f(i,j)表示打了i行出现j个bug的方案数. 还是跟背包有点像嘛. #include<cstdio> using namespace std; int n,m,b,mod,a[510] ...

  9. html基础知识介绍

    1 前端概要 前端三大利器 1.html  赤裸裸的人 2.css   穿上华丽的衣服 3.js    让人生动起来 2 HTML本质及在web程序中的作用 2.1 介绍 HTML 1.一套规则,浏览 ...

  10. Problem A: 逆序输出数列

    #include<stdio.h> int main(void) { int n,i,a[100]; while(scanf("%d ",&n)!=EOF) { ...