A
给出数A和B。
每次可以进行 这两步操作
求让A变成0,最小的操作步数。
题解思路
枚举 + 剪枝 。
这题让我见识到了剪枝的强大之处。
一开始也想到了类似的方法,看到题目数据量大,就不敢写了。
其实幂次运算的数据量并不大的
我们很容易知道一个答案就是A-B+2,将B加到比A大然后做除法,这是B最大的情况。
每次将B不断向前加,再更新最小值,这样可以对枚举的区域进行剪枝。
幂次运算剪枝下来也就十多,K一下子变的好小了。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
long long a,b,k;
int main ()
{
int t;
cin>>t;
while(t--)
{
cin>>a>>b;
if ( !a )
{
cout<<"0\n";
continue;
}else if ( a < b )
{
cout<<"1\n";
continue;
}
k = a - b + 2 ;
for (int i = 0 ; i < k ; i++ )
{
long long t1 = b + i;
if ( t1 == 1 )
{
i++;
t1++;
}
long long t2 = a;
long long tmp = i;
while(t2)
{
t2/=t1;
tmp++;
}
k = min(tmp,k);
}
cout<<k<<"\n";
}
return 0;
}
B
题解思路
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
long long n;
long long a[100200];
long long sum[100200];
int main ()
{
int n,q,k;
cin>>n>>q>>k;
for (int i = 1 ; i <= n ; i++ )
cin>>a[i];
while(q--)
{
int t1,t2;
cin>>t1>>t2;
long long ans = (k - a[t2]) + (a[t1] - 1) + 2 * (a[t2] - a[t1] + 1 - (t2 - t1 + 1));
cout<<ans<<"\n";
}
return 0;
}