uva 10474

来源:互联网 发布:梅雨知时节的作品 编辑:程序博客网 时间:2024/04/29 17:24

题目大意: 现在有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回答Q个问题. 每个问题问是否有一个大理石写着某个整数x,如果是,还要回答那个大理石写着整数x,排序后的大理石从1~N编号。

题目分析:

排序查找,套二分查找的模板


#include <iostream>#include <set>#include <algorithm>#include <cstdio>using namespace std;int bsearch(int *A, int x, int y, int v){    int m;    while(x < y){        m = x + (y-x)/2;        if(A[m] >= v) y = m;        else x = m+1;    }    return x;}int a[10100], b[10100];int main(){    int n, q;    int cas = 0;    while(scanf("%d%d", &n, &q) != EOF){        if(!n && !q)            break;        for(int i = 0; i < n; ++i){            scanf("%d", &a[i]);        }        for(int i = 0; i < q; ++i){            scanf("%d", &b[i]);        }        sort(a, a+n);        printf("CASE# %d:\n", ++cas);        for(int i = 0; i < q; ++i){            printf("%d ", b[i]);            int t = bsearch(a, 0, n-1, b[i]);            if(a[t] == b[i])                printf("found at %d\n", t+1);            else                printf("not found\n");        }    }}


这里补充STL的用法:

STL       lower_bound作用是查找大于或等于x的第一个位置;

#include <cstdio>#include <iostream>#include <algorithm>#include <vector>using namespace std;int N, Q;int main(){    int cas = 0;    vector<int> iv;    while(scanf("%d%d", &N, &Q) != EOF && (N || Q)){        int v;        for(int i = 0; i < N; ++i){            scanf("%d", &v);            iv.push_back(v);        }        cout << "CASE# " << ++cas << ':' << endl;        sort(iv.begin(), iv.end());        for(int i = 0; i < Q; ++i){            int num;            scanf("%d", &num);            int p = lower_bound(iv.begin(), iv.end(), num) - iv.begin();            if(iv[p] == num) printf("%d found at %d\n", num, p+1);            else printf("%d not found\n", num);        }        iv.clear();    }}



0 0