P10892题解

题意

(极简),给你 t 个 n 让你对于每个 n 求最少纠结次数,即此时 n 为奇数的次数。 当 n 为奇数时,可以选择交出 (n+1)/2​ 只猫猫还是交出 (n−1​)/2 只猫猫。

思路

从 1 到 t ,每次输入一个 n ,我们只需要 while 当 n 不为零时循环即可,如果是偶数的话不会纠结,只需要将 n 除以二,但是如果陷入了纠结,那么我们优先判断交出猫猫的数量多的,而且留下的是偶数的,是偶数我们就成功地避免了一次纠结,而且 n 早等于零就早点结束,早点结束就意味着纠结的次数可能会少,所以我们应当优先选择大的送走,如果大的送完留下的不是偶数,那么我们此时只能送走小的,然后纠结数加一,因为是要有奇数,就会有纠结,消灭奇数,人人有责当 n 为零时,循环结束,输出纠结总数, 进入下一次循环。

警示后人,一定要用 "\n" ,而不是 endl !endl 会进行多次的系统函数调用,而 "\n" 不会。如果你用了 endl 恭喜您喜提三十分的高分。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, t, x, y;
	cin >> t;
	for (int i = 1; i <= t; i++) {
		long long ans = 0;
		cin >> n;
		while (n) {//n以后不会再用到,直接拿出来除以即可 
			if (n % 2 == 0) {//偶数直接除以二 
				n /= 2;
				continue;
			}
			x = n - n / 2;//大的
			y = n - n / 2 - 1;//小的
			if (x % 2 == 0) {//先判断大的,因为早点交完能减少纠结次数
				n = x;
			}
			if (y % 2 == 0) {//大的不行就小的
				n = y;
			}
			ans++;//是奇数增加纠结次数
		}
		cout << ans << "\n";//输出,不要忘了换行,听我一句劝,不要用endl,调了1H
	}
	return 0;//好习惯 
}

撒花花,撒花花。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值