根据题目中一开始扔出的脑筋急转弯,其实可以发现1 2 4 8 ....这种数字是一个等比数列。很自然地想到转换成一个等比数列的求和问题。
for (i = 1;sum<m;i = i * 2)
{
sum = sum + i;
count++;
if (sum>=m)
{
cout << count << endl;
break;
}
很自然就写出了以上的等比数列求和代码。但是其实发现过不去一个特殊的测试用例"7 7"这组,通过你调试
可以发现 sum=1 ,sum=3的时候能进for 当sum=7时进的if判断了,然后加1得到了错误的结果。本人想到了最快的方法就是把if里面"="的改掉了,结果发现更错了,其实。(其实到现在也没有相通)后面去看了别人的提交是发现要改for循环的判断条件是sum+i<m。我是这么想的,sum是前面的和的大集体,当纳入的新的成员i,超出了m,说明这个成员我不能接受,也就是官方题解中的特别注意的事项。(本人第一次写题解,如有不足请多多见谅)
最后附上修改的代码
#include
#include <math.h>
using namespace std;
int main() {
long long t;
cin >> t;
long long i, len, m, count, sum;
while (t--)
{
count = 0;
sum = 0;
cin >> len >> m;
for (i = 1;sum+i<len;i = i * 2,count++)
{
sum = sum + i;
if (sum>=m)
{
count++;
break;
}
}
cout<<count<<endl;
}
}