差分与前缀和是一对互逆的操作,常常用于处理区间问题,差分法是解决区间加减问题,前缀和是解决区间求和问题的常用办法。
1.差分法
差分法的特点:
1.将对于区间的加减操作转化为对于端点的操作;
2.时间复杂度为 O(n);
3.用于维护区间的增减但不能维护乘除;
4.差分后的序列比原来的数组序列多一个数。
先差分,后加减,再还原,去掉最后一项。
2.前缀法
前缀和的特点:
将对于区间的求和操作转化为对于端点值的减法的操作;
区间求和操作的时间复杂度为 O(1);
数组存放时要从 1 开始;
前缀和数组比原来的数组序列多一个数,第 0 个
3.鲁卡斯队列
stringstream类:使用字符串和数字互相转换
需要包含头文件#include
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
double a[51] = { 1,3 };
void init()
{
for (int i = 2; i < 50; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
}
string comp()
{
for (int i = 0; i < 50; i++)
{
double b = a[i] / a[i + 1];
if (abs(b - 0.618034) <= 0.000001)
{
stringstream s1;
s1 << a[i] << "/" << a[i + 1];
string s;
s1>>s;
return s;
}
}
}
int main()
{
init();
string ans=comp();
cout<<ans<<endl;
return 0;
}
4.金币(基于前缀和的模拟)
这里注意跳出多重循环,可以用子函数return 来结束
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int comp(int n)
{
int sum = 0;
int day = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < i; j++)
{
sum += i;
day += 1;
if (day == n)
return sum;
}
}
return sum;
}
int main()
{
int n;
cin>>n;
int ans=comp(n);
cout<<ans;
}