zoukankan      html  css  js  c++  java
  • poj1844

    题意:给出S(S>0)位置某一个到迭代,问是否存在N使得1~N这些数字相加减(每个数字只使用一次)能得到S。

    分析:1+..+N<S, 一定无法构成,N需要增加

    1+..+N=S直接输出N

    1+..+N>S需要把一些数字改成负的,改1则总和减少2,改2则总和减少4……用这种方式可以构成所有的0到1+..+N之间的与1+..+N差为偶数的数字。如果差小于等于N*2则可以直接通过一个数字的变号得到,如果大于N*2则先将N变号,然后迭代为N-1的子问题。一定某一个位置之后可以用一个数字的变号解决,因为一直迭代下去,变成负号的数字过多,会造成式子计算结果为负数。

    所以只要总和-S为偶数即可构成,如果不是偶数则N需要增加。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    usingnamespace std;

    int main()
    {
    //freopen("t.txt", "r", stdin);
    int n;
    scanf(
    "%d", &n);
    int sum =0;
    int i =0;
    while (sum < n || (sum - n) &1)
    {
    i
    ++;
    sum
    += i;
    }
    printf(
    "%d\n", i);
    return0;
    }
  • 相关阅读:
    获取css信息
    html嵌套规则
    js获取ip地址
    match excel test search replace 用法
    js 宽和高
    判断类型 从零开始系列
    js随机数 从头开始系列
    苹果自带拼音转换方法
    iOS GCD 拾遗
    iOS用户响应者链的那些事儿
  • 原文地址:https://www.cnblogs.com/rainydays/p/2078034.html
Copyright © 2011-2022 走看看