[SinGuLaRiTy] 复习模板-搜索
生活随笔
收集整理的這篇文章主要介紹了
[SinGuLaRiTy] 复习模板-搜索
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【SinGuLaRiTy-1043】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.
桶排序
void bucketSort(int a[], int n, int max)//a[]為待排序數(shù)組,n為數(shù)組長度,max為數(shù)組中的最大值范圍 {int i,j;int buckets[max];// 將buckets中的所有數(shù)據(jù)都初始化為0。memset(buckets, 0, max*sizeof(int));// 1. 計(jì)數(shù)for(i = 0; i < n; i++) buckets[a[i]]++; // 2. 排序for (i = 0, j = 0; i < max; i++) {while( (buckets[i]--) >0 )a[j++] = i;} }優(yōu)先隊(duì)列
#include<stdio.h> #include<functional> #include<queue> #include<vector> using namespace std; //定義結(jié)構(gòu),使用運(yùn)算符重載,自定義優(yōu)先級(jí)1 struct cmp1{ bool operator ()(int &a,int &b){ return a>b;//最小值優(yōu)先 } }; struct cmp2{ bool operator ()(int &a,int &b){ return a<b;//最大值優(yōu)先 } }; //定義結(jié)構(gòu),使用運(yùn)算符重載,自定義優(yōu)先級(jí)2 struct number1{ int x; bool operator < (const number1 &a) const { return x>a.x;//最小值優(yōu)先 } }; struct number2{ int x; bool operator < (const number2 &a) const { return x<a.x;//最大值優(yōu)先 } }; int a[]={14,10,56,7,83,22,36,91,3,47,72,0}; number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0}; number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0}; int main() { priority_queue<int>que;//采用默認(rèn)優(yōu)先級(jí)構(gòu)造隊(duì)列 priority_queue<int,vector<int>,cmp1>que1;//最小值優(yōu)先 priority_queue<int,vector<int>,cmp2>que2;//最大值優(yōu)先 priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”會(huì)被認(rèn)為錯(cuò)誤, //這是右移運(yùn)算符,所以這里用空格號(hào)隔開 priority_queue<int,vector<int>,less<int> >que4;////最大值優(yōu)先 priority_queue<number1>que5; priority_queue<number2>que6; int i; for(i=0;a[i];i++){ que.push(a[i]); que1.push(a[i]); que2.push(a[i]); que3.push(a[i]); que4.push(a[i]); } for(i=0;num1[i].x;i++) que5.push(num1[i]); for(i=0;num2[i].x;i++) que6.push(num2[i]); printf("采用默認(rèn)優(yōu)先關(guān)系:\n(priority_queue<int>que;)\n"); printf("Queue 0:\n"); while(!que.empty()){ printf("%3d",que.top()); que.pop(); } puts(""); puts(""); printf("采用結(jié)構(gòu)體自定義優(yōu)先級(jí)方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n"); printf("Queue 1:\n"); while(!que1.empty()){ printf("%3d",que1.top()); que1.pop(); } puts(""); printf("Queue 2:\n"); while(!que2.empty()){ printf("%3d",que2.top()); que2.pop(); } puts(""); puts(""); printf("采用頭文件\"functional\"內(nèi)定義優(yōu)先級(jí):\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n"); printf("Queue 3:\n"); while(!que3.empty()){ printf("%3d",que3.top()); que3.pop(); } puts(""); printf("Queue 4:\n"); while(!que4.empty()){ printf("%3d",que4.top()); que4.pop(); } puts(""); puts(""); printf("采用結(jié)構(gòu)體自定義優(yōu)先級(jí)方式二:\n(priority_queue<number>que)\n"); printf("Queue 5:\n"); while(!que5.empty()){ printf("%3d",que5.top()); que5.pop(); } puts(""); printf("Queue 6:\n"); while(!que6.empty()){ printf("%3d",que6.top()); que6.pop(); } puts(""); return 0; }Set
#include <iostream> #include <set>using namespace std;int main() {set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(1);cout<<"set 的 size 值為 :"<<s.size()<<endl;cout<<"set 的 maxsize的值為 :"<<s.max_size()<<endl;cout<<"set 中的第一個(gè)元素是 :"<<*s.begin()<<endl;cout<<"set 中的最后一個(gè)元素是:"<<*s.end()<<endl;s.clear();if(s.empty()){cout<<"set 為空 !!!"<<endl;}cout<<"set 的 size 值為 :"<<s.size()<<endl;cout<<"set 的 maxsize的值為 :"<<s.max_size()<<endl;return 0; }Map
#include <iostream> #include <map>using namespace std;int main() {// map是一種關(guān)聯(lián)容器類,里面存儲(chǔ)的元素類型為pair<const KEY, DATA>。不同的元素KEY值不同。 // 定義map及其對(duì)應(yīng)的迭代器map<char, int> mapTest;map<char, int>::iterator iterTest;// 在map中插入元素// 這種利用下標(biāo)值的插入方式,當(dāng)map中沒有對(duì)應(yīng)鍵值的元素時(shí),插入。當(dāng)map中存在對(duì)應(yīng)鍵值的元素時(shí),修改其值或者獲取其值。mapTest['a'] = 10;mapTest['b'] = 20;mapTest['c'] = 30;mapTest['a'] = 15;// 這種使用insert的插入方式,當(dāng)map中沒有對(duì)應(yīng)鍵值的元素時(shí),插入。當(dāng)map中存在對(duì)應(yīng)鍵值的元素時(shí),不插入元素。pair<map<char, int>::iterator, bool> ret;mapTest.insert(map<char, int>::value_type('d', 40));ret = mapTest.insert(make_pair('d', 50));mapTest.insert(make_pair('e', 50));// 當(dāng)使用insert函數(shù)后會(huì)返回pair<map<char, int>::iterator, bool>類型的值,bool值表示是否插入成功。迭代器指向插入的元素。cout << ret.second << endl;// map中查找某個(gè)指定鍵值的元素,查找成功則返回對(duì)應(yīng)的迭代器。查找失敗則返回.end()對(duì)應(yīng)的容器邊界迭代器。iterTest = mapTest.find('f');cout << (iterTest == mapTest.end()) << " find: 0 means success, 1 means failure"<< endl;// 正向遍歷cout << "正向" << endl;for (iterTest = mapTest.begin(); iterTest != mapTest.end(); iterTest++){cout << iterTest->first << " " << iterTest->second << endl;}// 反向遍歷cout << "反向" << endl;map<char, int>::reverse_iterator iter;for (iter = mapTest.rbegin(); iter != mapTest.rend(); iter++){cout << iter->first << " " << iter->second << endl;}// 使用size獲取容器中元素個(gè)數(shù)int num;num = (int)mapTest.size();cout << num << endl;// 使用clear清空容器 mapTest.clear();// 使用empty判斷容器是否為空if (mapTest.empty()){cout << "The map is empty" << endl;}return 0; }Hash
#include <iostream> #include <cstring>using namespace std;const int maxn=11111; const int maxh=10000019; int head[maxh]; int next[maxh]; long long st[maxn];void hash_init() {memset(head,0,sizeof(head)); }int hash(long long p,int prime=10000019) {int h;//hash操作h=p%prime;return h; }bool add_hash(int s) {int h=hash(st[s]);int u=head[h];while(u){//if (memcmp(st[u],st[s],sizeof(st[s]))==0) return 0;//if (strcmp(st[u],st[s])==0) return 0;if (st[u]==st[s]) return 0;u=next[u];}next[s]=head[h];head[h]=s;return 1; }bool search_hash(long long p) {int h=hash(p);int u=head[h];while (u){//if (memcmp(st[u],p,sizeof(st[u]))==0) return 1;//if (strcmp(st[u],str)==0) return 1;if (st[u]==p) return 1;u=next[u];}return 0; }IDA* (以 埃及分?jǐn)?shù) 為例)
#include <cstdio> #include <cstring> #include <iostream> #define MAXN 10000 typedef long long LL; using namespace std;int maxd; LL ans[MAXN]; LL v[MAXN]; LL gcd(LL a,LL b){return b==0?a:gcd(b,a%b); } int get_first(int a,int b){if(b%a==0) return b/a;else return (b/a+1); } bool better(int d){return ans[d]==-1||v[d]<ans[d]; } bool dfs(int d,int from,LL aa,LL bb){if(d==maxd){if(bb%aa) return false;v[d]=bb/aa;if(better(d)) memcpy(ans,v,sizeof(LL)*(d+1));return true;}bool ok=false;from=max(from,get_first(aa,bb));for(int i=from;;i++){if(bb*(maxd+1-d)<=i*aa) break;v[d]=i;LL b2=bb*i;LL a2=aa*i-bb;LL g=gcd(a2,b2);if(dfs(d+1,i+1,a2/g,b2/g)) ok=true;}return ok; } int main(){int a,b;while(scanf("%d%d",&a,&b)==2){for(maxd=1;;maxd++){///IDmemset(ans,-1,sizeof(ans));if(dfs(1,get_first(a,b),a,b)) break;}for(int i=1;ans[i]!=-1;i++)printf("%lld ",ans[i]);printf("\n");}return 0; }雙向BFS (以 HDU-1195 為例)
#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <string> #include <string.h> #include <algorithm> using namespace std; #define LL __int64 #define eps 1e-8 #define INF 1e8 #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int MOD = 2333333; const int maxn = 10000 + 5; vector <int> e[maxn]; int vis[maxn] , dist[maxn];void solve(int x) {int num[4] , i , tmp , y;i = 0;tmp = x;while(tmp) {num[i++] = tmp % 10;tmp /= 10;}for(i = 0 ; i < 4 ; i++)if(num[i] == 0)return;for(i = 0 ; i < 4 ; i++) {if(i < 3) {swap(num[i] , num[i + 1]);y = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];e[x].push_back(y);e[y].push_back(x);swap(num[i] , num[i + 1]);}tmp = num[i];if(num[i] == 9)num[i] = 1;elsenum[i]++;y = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];e[x].push_back(y);e[y].push_back(x);num[i] = tmp;if(num[i] == 1) num[i] = 9;elsenum[i]--;y = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];e[x].push_back(y);e[y].push_back(x);num[i] = tmp;} } int BFS_2(int start , int end) {if(start == end)return 0;memset(vis , 0 , sizeof(vis));queue <int> que[2];vis[start] = 1;vis[end] = 2;que[0].push(start);que[1].push(end);dist[start] = dist[end] = 0;while(!que[0].empty() && !que[1].empty()) {int k = 0;if(que[0].size() < que[1].size())k++;int u = que[k].front();que[k].pop();for(int i = 0 ; i < e[u].size() ; i++) {int j = e[u][i];if(!vis[j]) {vis[j] = vis[u];que[k].push(j);dist[j] = dist[u] + 1;} else if(vis[j] == vis[u]) {continue;} else {return dist[j] + dist[u] + 1;}}}return -1; } int main() {int T , a , b;for(int i = 1111 ; i <= 9999 ; i++)solve(i);cin >> T;while(T--) {scanf("%d %d" , &a , &b);printf("%d\n" , BFS_2(a , b));}return 0; }?
Time: 2017-10-28
轉(zhuǎn)載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7747863.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的[SinGuLaRiTy] 复习模板-搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图数据库Neo4j全栈Web技术解密
- 下一篇: 微信小程序教程 [第五篇]脚本语言(WX