CF11B

CF 11B
  • 题目

    CF11B

  • 分析

    x x x : 最终要移动到的坐标 i n p u t input input

    i i i 次移动的距离为 i i i ,从坐标为 0 0 0 开始,可知 坐标为 U = 1 , 3 , 6 , 10... U = {1,3,6,10...} U=1,3,6,10... 这些数字的移动到的次数一定是最小。这提示可以先移动到这些数字的坐标上,再针对不是这些数字的 x x x 在进行移动。开始的想法是先移动到比 x x x 小的最接近 x x x 的那些数 a ∈ U a \in U aU 。这样的想法不对。应该先到达比 x x x 大的那些数 a ∈ U a \in U aU , 可算出 s u m = a − x sum = a - x sum=ax 想办法使得 s u m = = 0 sum == 0 sum==0 , 如果 s u m sum sum 是偶数 ,那么 可以在第 s u m 2 \frac{sum}{2} 2sum 次向左走,这样走的路数和没有加上 s u m 2 \frac{sum}{2} 2sum ,反而减去了 s u m 2 \frac{sum}{2} 2sum ,这样一来一去 就减去了 s u m sum sum 即得到答案。如果 s u m sum sum 是奇数就一直往前找即可。

  • 代码

    const int N = 1e6 + 6;
    ll a[N];
    int main ()
    {
    	//freopen("input.in", "r", stdin);
    	//freopen("test.out", "w", stdout);
    	int x;
    	cin >> x;
    	x = abs(x);
    	if (x == 0)
    	{
    		cout << 0 << endl;
    		return 0;
    	}
    	ll sum = 0;
    	int i = 0;
    	for (i = 1;; i++)
    	{
    		sum += i;
    		if (sum == x) break;
    		if (sum > x && (sum - x) % 2 == 0) break;
    	}
    	printf("%d\n", i);
    	return 0 ;
    }
    
    
  • 题型

    思维题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值