Uva 10474 sort以及lower_bound的用法
阿新 • • 發佈:2018-02-10
調用 iostream ostream 用法 return 必須 red 過大 names
現有N個大理石,每個大理石上寫了一個非負整數。首先把各數從小到大排序,然後回 答Q個問題。每個問題問是否有一個大理石寫著某個整數x,如果是,還要回答哪個大理石上 寫著x。排序後的大理石從左到右編號為1~N。(在樣例中,為了節約篇幅,所有大理石上 的數合並到一行,所有問題也合並到一行。)
樣例輸入:
4 1 (N Q)
2 3 5 1 (石頭)
5 (問題)
5 2
1 3 3 3 1
2 3
樣例輸出:
CASE #1:
5 found at 4
CASE #2:
2 not found
3 found at 3
#include<iostream> #include<stdio.h> #include<string> #include<algorithm> using namespace std; int main() { int N, Q; while (scanf("%d%d", &N, &Q) == 2) { int *a = new int[N]; int *b = new int[Q]; for(int i=0;i<N;i++) scanf("%d", &a[i]); for(int j=0;j<Q;j++) scanf("%d", &b[j]); sort(a, a + N); bool flag=false; for (int k = 0; k < Q; k++) { for (int l = 0; l < N; l++) if (b[k] == a[l]) { flag = true; printf("%d found at %d\n", b[k], l + 1); break; }if (flag != true) { printf("%d not found\n", b[k]); } } delete[]a; delete[]b; a = NULL; b = NULL; } }
很基礎的排序和查找,然而自己卻卡在while上一會,不心細果然什麽都辦不了
用stl會快很多
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 10000; int main() { int n, q, x, a[maxn], kase = 0; while (scanf("%d%d", &n, &q) == 2 && n) { printf("CASE# %d:\n", ++kase); for (int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a + n); //排序 while(q--) { scanf("%d", &x); int p = lower_bound(a, a+n, x) - a; //在已排序數組a中尋找x if(a[p] == x) printf("%d found at %d\n", x, p+1); else printf("%d not found\n", x); } } return 0; }
sort
排序,並非只是普通的快速排序,除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。當數據量較大時采用快速排序,分段遞歸。一旦分段後的數據量小於某個閥值,為避免遞歸調用帶來過大的額外負荷,便會改用插入排序。而如果遞歸層次過深,有出現最壞情況的傾向,還會改用堆排序。
#include <algorithm> template< class RandomIt > void sort( RandomIt first, RandomIt last ); template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp );
cmp的用法自行定義
例如:
#include<iostream> #include<stdio.h> #include<string> #include<algorithm> using namespace std; struct Node { int x, y; }p[1001]; int n; int cmp(Node a, Node b) { if (a.x != b.x) return a.x < b.x; //如果a.x不等於b.x,就按x從小到大排 return a.y < b.y; //如果x相等按y從小到大排 } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].x, &p[i].y); sort(p + 1, p + n + 1, cmp); for (int i = 1; i <= n; i++) printf("%d %d\n", p[i].x, p[i].y); return 0; }
lower_bound
查找一個比自己大或者和自己相等的數並返回它的位置
註意:調用lower_bound之前必須確定序列為有序序列,否則調用出錯。
template<class ForwardIterator, class Type> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val ); template<class ForwardIterator, class Type, class BinaryPredicate> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val, BinaryPredicate _Comp );
傳入參數說明:
_First 要查找區間的起始位置
_Last 要查找區間的結束位置
_Val 給定用來查找的值
_Comp 自定義的表示小於關系的函數對象,根據某個元素是否滿足小於關系而返回true或者false
lower_bound(first,last,val)表示找到第一個>=val的值的地址
upper_bound(first,last,val)表示找到第一個>val的值的地址
在lower_bound(first,last,val,cmp)中cmp是比較函數
在lower_bound(first,last,val)中cmp默認為
bool cmp(mid,val){ return mid<val;//表示如果mid<val 則繼續lower_bound }
所以當mid>=val時停止
Uva 10474 sort以及lower_bound的用法