一、 三分算法
三分算法和二分算法差不多都是从最小的到最大的依次进行查找。
例如定义:left和right
Mid=(left+right)/2;
Midmid=(Mid+right)/2;
如果Mid靠近极值点,则right=Midmid;
否则(Midmid靠近极值点)则left=Mid;
下面给个模板:
double mid,midmid;
while(low<high)
{
mid=(low+high)/2;
midmid=(mid+high)/2;
double cmid=cal(mid);
double cmidmid=cal(midmid);
if(cmid>cmidmid)
high=midmid;
else
low=mid;
}
double cal(double x)
{
return 关于x的方程式;
}
二、 单调队列
单调队列:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。。
单调队列的常用操作如下:
(1)插入:若新元素从队尾插入后会破坏单调性,则删除队尾元素,直到插入后不再破坏单调性为止,再将其插入单调队列。
(2)获取最优(最大、最小)值:访问首尾元素。
从小到大生成单调队列代码如下:
#include<bits/stdc++.h>
#define MAXN 80050
#define LL long long
using namespace std;
LL q[MAXN];
int main()
{
int n;
scanf("%d",&n);
LL a;
LL ans=0;
memset(q,0,sizeof(q));
int rear=-1,front=0;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a);
while(rear>=front&&q[rear]>a)rear--;
q[++rear]=a;
}
for(int i=0;;i++)
{
if(q[i]==0)
break;
else
cout<<q[i]<<" ";
}
return 0;
}
从大到小生成单调队列代码如下:
#include<bits/stdc++.h>
#define MAXN 80050
#define LL long long
using namespace std;
LL q[MAXN];
int main()
{
int n;
scanf("%d",&n);
LL a;
LL ans=0;
memset(q,0,sizeof(q));
int rear=-1,front=0;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a);
while(rear>=front&&q[rear]<=a)rear--;
q[++rear]=a;
}
for(int i=0;;i++)
{
if(q[i]==0)
break;
else
cout<<q[i]<<" ";
}
return 0;
}
三、最近的感悟
五一假期不该回家的,回了家,,真的没学啥。