UVa 10025 - The ? 1 ? 2 ? ... ? n = k problem

来源:互联网 发布:牧草大数据 编辑:程序博客网 时间:2024/05/29 06:36

题目:给你一个整数m,你需要确定一个从1开始的连续整数集合,使得所有数字之和是m。

            每个数字可以取正好或者负号中的一个。

分析:简单题、找规律。我们先把前几个集合写出来

            原始集合:                              可计算出的结果:

            {1}                                             {±1}

            {1,2}                                       {±1,±3} 

            {1,2,3}                                 {±0,±2,±4,±6}

            {1,2,3,4}                           {±0,±2,±4,±6,±8,±10}

            {1,2,3,4,5}                     {±1,±3,±5,±7,±9,±11,±13,±15}

            通过观察,可以发现规律,生成集合分为奇数集合和偶数集合两种,而且两组一次变化,

            并且是区间[ 0,(n(n+1))/ 2 ]上所有的奇数和偶数。

            所以只要能够找到最小的数字n,使得m <(n(n+1))/ 2 就能确定我们要找的数字。

            如果{1,...,n}能确定的集合的奇偶性和m的相同,n即为所求;否则,答案就是n+1或者n+2 。

说明:╮(╯▽╰)╭由于本人比较懒,所以利用循环求解,应该可以常数时间确定n。

#include <iostream>#include <cstdlib>#include <cmath>using namespace std;int calc( int a ){int i = 1; while ( (i*(i+1))>>1 < a )i ++;while ( (i+1)/2%2 != a%2 ) i ++;return i;}int main(){int n,m;while ( cin >> n )while ( n -- ) {cin >> m;m = abs(m);cout << calc( m ) << endl;if ( n ) cout << endl;}return 0;}

0 0