【原创】UVAOJ水题10025解题报告

首先是原题,转自UVAOJ

 The ? 1 ? 2 ? ... ? n = k problem 

The problem

Given the following formula, one can set operators ‘+‘ or ‘-‘ instead of each ‘?‘, in order to obtain a given k
? 1 ? 2 ? ... ? n = k

For example: to obtain k = 12 , the expression to be used will be:
- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 
with n = 7

The Input

The first line is the number of test cases, followed by a blank line.

Each test case of the input contains integer k (0<=|k|<=1000000000).

Each test case will be separated by a single line.

The Output

For each test case, your program should print the minimal possible n (1<=n) to obtain k with the above formula.

Print a blank line between the outputs for two consecutive test cases.

Sample Input

212-3646397

Sample Output

72701



Alex Gevak
September 15, 2000 (Revised 4-10-00, Antonio Sanchez)

简单说,就是一组从1开始到n的自然数序列,每个数字以前可以填写-号和+号,要求最后的结果等于另外给定的数字k。这里要求为了满足k,所能达到的最小的n。

分析:

此题当然可以穷举每个可能,但n个数需要穷举2^n次,也就是从1到n,需要穷举几何级数规模次,爆定了,抛弃;

但容易知道,当1到n1全是+号且和小于k时,不可能有解。因此,需要连加至sum > k时开始判断。

当sum > k时,设Q = sum - k,则k = sum -Q -> k = (1+2+3..+n) - Q。这里,需要转换该等式为1 + 2 - 3 - 4...+ n的形式。对于1到n而言,若欲改变特定数位正号为符号,需要减去两倍该数,而减去的数需从Q中分解,故有以下推论:

1、Q必须为偶数

2、当Q/2大于n时,需判断是否分解Q为x个不同偶数之和。

换言之,在n足够大时,由于任意大于4的偶数一定能分解为x个不同偶数之和同时2对应1而4对应2,我们就可以保证,当Q为偶数时,此时n为最小值;当Q为奇数时,由于无法将Q拆进原自然数序列,故此时n不是解。

前述断言,我想证明,但证明失败了。于是只能退而求其次,寻找结果为Q的不同偶数连续相加中的最大偶数。

如16 = 2 + 4 + 10,最大不重复偶数为10

设为函数fun,代码如下:

int fun(int x)

{

int left = 2;
    int result = 0;
    while(result == 0)
    {
     while(x - left < left)
    {
            if(left >= x)
            {
                    result = left;
                    break;
            }
            left += 2;
    }
    x -= left;
    left += 2;
    
    }
    return result;

}

这个函数返回最大偶数,跟n比较,若小于n,则证明偶数Q对应的n是解。

下面是全部代码

#include <stdio.h>
int main()
{
    int n;
    long long k;
    int i;
    int sum = 0;
    int result = 0;
    int flag = 0;
    int temp;
    int left;
    int right;
    scanf("%d",&n);
    while(n--)
    {

scanf("%lld",&k);
            sum = 0;
            flag = 0;
            if(k < 0)
                 k = -1 * k;
            for(i = 1;sum < k;i++)
                  sum += i;
            i --;
            if(sum == k)
            {
                   result = i;           
            }
                        if(k == 0)
                        result = 3;
            else
            {
                while(1)
                {
                        temp = sum - k;
                        if(temp % 2 != 0)
                        {
                                i++;
                                sum += i;
                                continue;
                        }        
                        else
                        {

int max = fun(k);

if(max <= n)
                                   break;
                        }
                }
                if(k)result = i;
            }        
    printf("%d\n",result);
    if(n)printf("\n");
    }
    return 0;
}

先前,我的while里的条件是 n!=0,循环体里有n--,但是WR过不了,换成while(n--)就过了,真是百思不得其解。。。

托这个的福,连续刷了3个wrong answer。。。

遗留问题:

直觉上,感觉Q是偶数就能解,但是始终拿不出严格的数学证明。于是,只能选择判断最大偶数与n孰大孰小的方案。首先,1加到n减去偶数Q大于0,因此,分解出不同偶数连续和中的所有偶数数目小于n,同时,用最大值来与n比较,若大于n,则无论怎么分解都无法在1~n的自然数序列中找到与之对应的值,当前n为解;若小于n则证明当前n为解。

时间: 2025-01-17 19:05:01

【原创】UVAOJ水题10025解题报告的相关文章

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

【原创】leetCodeOj --- Dungeon Game 解题报告

原题地址: https://oj.leetcode.com/problems/dungeon-game/ 题目内容: The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was init

【原创】poj ----- 1182 食物链 解题报告

题目地址: http://poj.org/problem?id=1182 题目内容: 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 48791   Accepted: 14222 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个

【原创】leetCodeOj --- Largest Number 解题报告

原题地址: https://oj.leetcode.com/problems/largest-number/ 题目内容: Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may

【原创】leetCodeOj ---Partition List 解题报告

原题地址: https://oj.leetcode.com/problems/partition-list/ 题目内容: Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in

【原创】leetCodeOj --- Sort List 解题报告

今日leetcode链表题全制霸 原题地址: https://oj.leetcode.com/problems/sort-list/ 题目内容: Sort List Sort a linked list in O(n log n) time using constant space complexity. 方法: 题目要求是链表排序,同时时间复杂度要求O(n log n),空间复杂度要求常数空间.这意味着你不可以把链表拷贝到数组中,用一个map保留值和指针的对应关系,最后在构造一个链表. 我们需

ACM 2018 南京网络赛H题Set解题报告

题目描述 给定\(n\)个数$a_i$,起初第\(i\)个数在第\(i\)个集合.有三种操作(共\(m\)次): 1 $u$ $v$ 将第$u$个数和第$v$个数所在集合合并 2 $u$ 将第$u$个数所在集合所有数加1 3 $u$ $k$ $x$ 问$u$所在集合有多少个数模$2^k$余$x$. 数据范围:\(n,m \le 500000,a_i \le 10^9, 0 \le k \le 30\). 简要题解 显然此题可以用set加启发式合并在\(O(n \log ^2 n)\)时间复杂度解

Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛之一了!(其中G.I和D题简直是好题中的好题!) 由于网上没有任何这套题的题解,我每道题都绞尽脑汁想了好久(尤其是D题.I题和H题证明),在此认认真真的写一篇博客,也真心希望好题能被更多的人发现和赞美. 题目概述 题目 思维难度  推荐指数 考点 A 3  ☆☆☆☆ 最长上升子序列 B 暂留坑,>7

两道递推公式题的解题报告

T1(阿牛的EOF牛肉串) 题意:一串由EOF三个字母组成的长度为\(n\)的字母串,不能出现连续的OO,求字符串种类数\(f[n]\) 答案:\(f[n]=2f[n-1]+2f[n-2]\) --① 注解: 如果a[n]取E,该情况下种类为f[n-1]: 如果a[n]取F,该情况下种类为f[n-1]; 如果a[n]取O,则只能取a[n-1]为E或F,分别有f[n-2]种. 综上,一共有f[n-1]+f[n-1]+f[n-2]+f[n-2]种. T2 (原题找不到了,恳请见过的巨佬提供线索) 题