一、 三分算法
三分算法和二分算法差不多都是從最小的到最大的依次進行查找。
例如定義: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;
}
三、最近的感悟
五一假期不該回家的,回了家,,真的沒學啥。