1. 程式人生 > >Uva 10474 sort以及lower_bound的用法

Uva 10474 sort以及lower_bound的用法

調用 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的用法