資料結構與演算法入門題

kiki發表於2021-08-06

排序

std::sort函式

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){  //重寫比較規則,預設小於運算子定序
    return a>b;
}
int main(){
    int b[30];
    sort(b,b+30,cmp);
    return 0;
}

算符過載

struct stu{
    int sno;
    int grade;
    bool operator < (const stu &b) const {
        if(grade!=b.grade) return grade<b.grade;
        else return sno<b.sno;
    }
}buf[1000];

日期類問題

日期差值

題解1:計算兩個日期相對於0000 00 00 的差值,然後差值相減+1

題解2:令日期不斷+1,直到第一個日期等於第二個日期

題解3:預處理,使用三維陣列,用年月日分別表示下標,是hash的基本思想

//判斷閏年巨集定義
#define ISYEAP(x) ((x%100!=0&&x%4==0)||(x%400==0)) ? 1:0
//預存每月天數
int dayTab[2][13]={
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}};
//預處理每一天與原點日期的天數差
while(tmp.Year != 3001) { 
    buf[tmp.Year][tmp.Month][tmp.Day] = cnt; 
    tmp.nextDay(); 
    cnt ++;
} 

解決區間問題

把原區間問題統一到起點確定的區間問題上去

這樣做還可以帶來一個好處——預處理;可以在程式真正開始處理輸入資料之前,預處理出所有資料;當資料真正開始輸入時,只需要用O(1)的時間複雜度將儲存的資料讀出,稍加處理就能得到答案;預處理是空間換時間的重要手段

Hash應用

將儲存位置與資料本身對應起來的儲存手段就是hash

空間換時間,可以降低時間複雜度

題目中往往給出嚴格的區間

排版題

先完成排版,再進行輸出

二維的問題可能需要三重迴圈

基本的查詢

基本要素

查詢空間:也常被稱為解空間。所謂查詢,就是在該查詢空間中找尋符合 我們要求的解的過程。

查詢目標:我們需要一個目標來判斷查詢空間中的各個元素是否符合我們的要求,以便判斷查詢活動是否已經成功

查詢方法:即利用某種特定的策略在查詢空間中查詢各個元素。不同的策 略對查詢的效率和結果有不同的影響,所以對於某個特定的問題,我們要選擇切 實可行的策略來查詢解空間

二分查詢:

​ 時間複雜度:O(logL)

​ 重要應用:定界--確定邊界點

貪心演算法

思想:選擇“當前最好的選擇”,而不從整體上去把握

使用反證法來證明

經典問題:固定金錢最多能買到多少物品--每次買價效比最高的物品

收看節目中結束時間最早的節目,是我們要找的貪心策略

經典問題:fill or not to fill

描述:由於有高速公路,從杭州開車到任何其他城市都很方便。但由於汽車的油箱容量有限,不得不在途中找加油站加油。在不同的加油站,加油的價格可能不同。請設計最便宜的路線。

常規思路:
對於當前站點S,所能到達的最大範圍即滿油量所能到達的距離,設滿油量能前進的距離為maxToGo,則在S到S+maxToGo範圍內,分如下情況進行考慮:
Ⅰ此範圍內有加油站
①有比當前站點便宜的加油站,因為只從最小的區域性考慮問題,如果有多個比當前便宜的,到達那個最近的而不是最便宜的(只需要在找到第一個比S便宜的站點時break即可)。
②全部比S更貴(易錯點)
2.1 如果從S無法到達終點,則選擇最便宜的那個,從S加滿油到達那個站點。
2.2 如果從S可以直接到達終點,則從S加油至能到達終點,直接開到終點。
Ⅱ此範圍內無加油站
①如果從S可以直接到達終點,則加到能到達終點,直接到達。
②如果從S無法到達終點,加滿油,能跑多遠跑多遠。

更清晰一些的貪心策略:

按照價格從低到高將加油站排序。從價格最低的加油站開始,加油使其能走儘量遠的距離(不覆蓋已走過的距離&&不超過終點的距離)。

相關文章