Training-1——F. Building Numbers
题目来源:Codeforces
题解
贪心算法和前缀和算法的应用。
已知数 N,欲使从 1 操作到 N 的次数最少,即从 N 反向操作到 1 的次数最少。
Ans = 操作(如果被操作数 tmp 为偶数, 则除 2 , 否则减 1)
次数。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
typedef long long ll;
int n, q;
ll solve(ll x)
{
int ans = 0;
// 到达 1 时结束循环
while (x != 1)
{
// 偶数除 2,奇数减 1
if (x % 2 == 1)
{
x--;
++ans;
}
else
{
x /= 2;
++ans;
}
}
return ans;
}
int main()
{
int t = 0;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &q);
ll ans[maxn];
for (int i = 1; i <= n; ++i)
{
scanf("%lld", &ans[i]);
// 前缀和
ans[i] = ans[i - 1] + solve(ans[i]);
}
int x, y;
while (q--)
{
scanf("%d%d", &x, &y);
printf("%lld\n", ans[y] - ans[x - 1]);
}
}
return 0;
}