题意
(极简),给你 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;//好习惯
}
撒花花,撒花花。