5月4日學習總結

一、 三分算法

三分算法和二分算法差不多都是從最小的到最大的依次進行查找。

例如定義: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;
}

三、最近的感悟
五一假期不該回家的,回了家,,真的沒學啥。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章