今天写oj刷到一个题
是 noip2016 模拟
其实利用倍增算法的思想可以轻松解决并且快速
说明 i<<=1 是i向左进一位
根据二进制性质
也就是 i=i*2
#include<iostream>
using namespace std;
int main()
{
int a, b, c;
int a1, b1, c1;
int n;
cin >> n;
int qian;
int min = 1e8;//此处其实可以用数组进行 or别的方法 优化处理 但是我懒
for (int i = 1; i <= 3; i++)
{
cin >> a >> a1;
int js, js1;
js = a;//记录下刚开始的数
js1 = a1;
while (n >a)//疯狂地*2*2*2
{
a <<=1 ;
a1 <<=1;
}
while (n<a)//多了得收回来一点
{
a = a - js;
a1 = a1 - js1;
}
while (n>a)//收多了 那么就放回去一点
{
a = a + js;
a1 = a1 + js1;
}
qian = a1;
if (min > qian)
{
min=qian;
}
}
cout << min;
return 0;
}
时间复杂度 ;
所对应的区间就翻了一倍,由此时间复杂度是O(logn)
裸的倍增几乎没有,这是一个精巧的算法,像枚举一样穿插在代码间
但倍增的应用比较有趣 列如 ST表和倍增爬树
后期将会进一步完善…