zoukankan      html  css  js  c++  java
  • UVa 10025: The ? 1 ? 2 ? ... ? n = k problem

    这道题仔细思考后就可以得到比较快捷的解法,只要求出满足n*(n+1)/2 >= |k| ,且n*(n+1)/2-k为偶数的n就可以了。注意n==0时需要特殊判断。

    我的解题代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    	long long T,K,k,n;
    	cin >> T;
    	while(T--)
    	{
    		cin >> K; if(K<0) k=-K; else k=K;
    		if(K==0) cout << 3 << endl;
    		else
    		{
    			double ans = (sqrt(1.0+8*k)-1)/2;
    			n=ceil(ans);
    			while((n*(n+1)/2-K)%2) n++;
    			cout << n << endl;
    		}
    		if(T) cout << endl;
    	}
    	return 0;
    }
    

    附上题目如下:

    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

     

    2
    
    12
    
    -3646397
    

     

    Sample Output

     

    7
    
    2701
    

     



  • 相关阅读:
    Hello,Cnblogs,I'm Kxia
    运维
    CRT 操作数据库乱码
    STM32 各引脚功能
    遍历结果集
    更换税控服务器主板后,重新申请注册码
    修改远程桌面端口号
    nginx 设置开机启动
    windows 日志清理批处理 设置到计划任务就可以每天清理日志了
    按关键字查找文件
  • 原文地址:https://www.cnblogs.com/riskyer/p/3237015.html
Copyright © 2011-2022 走看看