第八章 高效演算法設計

2021-07-04 08:19:38 字數 2894 閱讀 5370

分治法求最大連續和

注意範圍是[x,y)

#includeusing namespace std;

int maxsum(int *a,int x,int y)

int main()

; // -3 -1 0 1 2

int t[100];

k=0;

printf("%d\n",quicksort(a,0,4));

return 0;

}

二分查詢折半查詢

迭代實現

#includeusing namespace std;

int bsearch(int *a,int x,int y,int v)

return -1;

}int main()

; // -3 -1 0 1 2

int t[100];

sort(a,a+5);

printf("%d\n",bsearch(a,0,5,-3));

return 0;

}

二分查詢求上下界

stl中也有這兩個函式可以直接用

#includeusing namespace std;

int lower_bound(int *a,int x,int y,int v)

return x;

}int upper_bound(int *a,int x,int y,int v)

int main()

迴圈日程表問題:出不來

巨人與鬼:暫時忽略

貪心法:

最優裝載問題:純貪心

部分揹包問題:按比值貪心

第一種:a1>a2 選擇a1 然後:a1區間選點問題:按b排序,第乙個區間取最後乙個點

區間覆蓋問題:

預處理:

先切掉[s,t]外的部分

按a排序,起點非s,無解

否則選擇起點為s的最長區間

然後新的起點為上乙個區間的終點

huffman編碼:

先排序把字元排成表p,建立新節點佇列,每次兩兩合併

構造法:

例題8-1:uva120煎餅

書上給的分析很明白,其實就是讓去找乙個可行解,但不知道是不是最優

這種就叫構造演算法吧,每次拍一次最大的,最大的排號就不用管了

問題是用陣列實現起來真的很麻煩,看到乙個666的題解,雙端佇列,還有reverse翻轉,注意翻轉是有順序的。

#includeusing namespace std;

int main()

printf("\n");

}printf("\n");

for(int i=0;i25) printf("%c",b[i][j]-26+'a');

else

printf("%c",b[i][j]+'a');

}printf("\n");

}printf("\n");

}return 0;

}

中途相遇法:從兩個方向解決問題,最後彙總

8-3 uva1152 和為0的四個值

這個題的hash寫的很精妙,好好體會

#includeusing namespace std;

struct hashmap

int & operator (int k)

}hash;

int main()

b[5050];

bool cmp1(pp a,pp b)

}sort(b,b+n,cmp2);

// for(int i=0;i=i &&!b[j].y)

}if(aa==n&&bb==n)

cout<

例題8-6 兩性親子 uva1606

極角排序的這個題並不會

#includeusing namespace std;

struct node

}c[1000],d[1000];

bool turn(node&a,node&b)

int main()

{ int n;

while(~scanf("%d",&n)&&n){

for(int i=0;i

視窗滑動法

例題8-7 唯一的雪花 uva11572

其實就是乙個迴圈便利,只不過根據題意如果遇到與當前序列重複的數,就需要從前面找到這個重複的數然後刪掉

每次都記錄最大的序列長度,便利一遍,即得結果,下面兩個實現,乙個set,乙個map

#includeusing namespace std;

const int maxn = 1e6 + 5;

int b[maxn];

int main()

{ int t,n;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

for(int i=0;is;

int l=0,r=0,ans=0;

while(r

#includeusing namespace std;

const int maxn = 1e6 + 5;

int a[maxn],last[maxn];

mapcur;

int main()

{ int t,n;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

cur.clear();

for(int i=0;i

使用資料結構:

再不用改變主演算法的情況下,提高執行效率

求f(i)i到k的最小值,要求f(1)...f(n-k+1)

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章 設計原則

模擬是避免做傻事的最佳方式。到目前為止我們一直致力於應用程式編碼之前的事情上,如收集需求 分析 編寫功能列表 繪製用例圖等。當然,在某些地方真的必須編寫一些 那是設計原則真正開始產生作用的地方。設計原則 是能被應用到設計或編寫程式 中的工具或技術,讓程式 更可維護 根具靈活性或者更易擴充套件。oo原...

第八章(筆記)

能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...