UVA10025

题目的意思就是给你一个数k;

问1?2?3?4?5?6........其中问号可以是加号或者减号,使式子等于k的最短序列。。

思路是,先把式子全部变成加号,直到大于等于k。全加才刚刚大于k,那有加有减就不可能等于k了。所以在这个长度的基础上去加就好。。

然后拿9这个数字来举例,加入你从1加到4等于10,大于9了。。现在你要想办法把加号改成减号,使他等于1.。可是这是不可能的。

因为10 - 1变成9,就算你只是把1改掉,他也会少2(因为加1变成减1一来一回差2).。

所以我们只能在多一位,变成1加到5 等于15,15比9大了6.。这样只要把+3改为-3就可以。。

规律就出来了。。从1开始一直加到大于k,并且和k差是偶数就可以了。。。。


AC代码:


#include<stdio.h>

int main () {
	long long k;
	long long i;
	long long len,res;
	int T;
	scanf("%d",&T);
	while (T--) {
		scanf("%lld",&k);
		if (k < 0)
			k = -k;
		for (i = 1 ;(1 + i) * i /2 < k ;i++);
		res = (1 + i) * i / 2;
		len = i;
		while ((res - k) % 2 != 0) {
			res += (++len);
			
		}
		printf("%lld\n",len);
		if(T)
			printf("\n");
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值