您的位置:首页 > 大数据 > 人工智能

hdu 6040 Hints of sd0061[2017 Multi-University Training Contest - Team 1] [STL]

2017-07-26 20:30 411 查看
题目链接

题意: 求a数组的第b[i]大数

分析: (1)首先要了解c++中求第k大数的STL函数nth_element(start,start + n, end); 这个函数可以使数组第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的. 复杂度为O(n).

(2) 将b数组从大到小排序, 由于由于排在前面的都是比第b[i]小元素, 所以下次调用函数中end参数, 就是上次得到的下标. 

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e7 + 10;
const ll mod = 1e9 + 7;

struct G {
int x, i;
bool operator < (const G &t) const {
return x > t.x;
}
};

unsigned gg[maxn], ans[120];
G r[120];
unsigned x, y, z;
unsigned rng61() {
unsigned t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}

int main() {
int v = 1, n, m;
unsigned a, b, c;
while(~scanf("%d %d %u %u %u", &n, &m, &a, &b, &c)) {
for(int i = 0; i < m; i++) {
scanf("%d", &r[i].x);
r[i].i = i;
}
x = a; y = b; z = c;
for(int i = 0; i < n; i++) {
gg[i] = rng61();
}
sort(r, r + m);
int nn = n;
for(int i = 0; i < m; i++) {
if(i && r[i].x == r[i - 1].x) {
ans[r[i].i] = ans[r[i - 1].i];
continue;
}
nth_element(gg, gg + r[i].x, gg + nn);
nn = r[i].x;
ans[r[i].i] = gg[r[i].x];
}
printf("Case #%d: ", v++);
for(int i = 0; i < m; i++) {
printf("%u%c", ans[i], i == m - 1 ? '\n' : ' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl
相关文章推荐