5 条题解
-
1
最短代码有没有?
#include <bits/stdc++.h> using namespace std; int main(){ int n,k,t; cin>>n>>k; set<int> mins; for (int i=0;i<n;i++) {cin>>t; mins.insert(t);} auto pos = mins.begin(); for (int i=1;i<k;i++) pos++; if (k>mins.size()) cout<<"NO RESULT"; else cout<< *pos; return 0; }
(说3遍)各STL容器+其迭代器一定要烂熟于心....
一大堆便宜又好用的瑞士军刀不用,考试时自己去构建数据结构,就是大憨憨。
你写的代码越少,出错的概率就越低。
自己构建数据结构这种事,在平时用来加深理解时候可以玩一玩。
- set元素是自动升序排列,自动去重
- 细节 :迭代器的自增操纵可能越过set.end()
可考虑的优化:
- 无需对整个输入数据进行排序,set中只要保持k个元素即可 。
- pos++ 时判断是否已经越过了 mins.size()
但本题的数据量很小,考试时只要AC了就下一题,无需纠结完美。
-
1
用计数排序
# include <bits/stdc++.h> using namespace std; int a[30000]; int main() { int n, k; scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { int num; scanf("%d", &num); a[num] = 1; } int cnt = 0; for (int i = 1; i < 30000; i++) { if (a[i] == 1) { cnt++; if (cnt == k) { printf("%d", i); return 0; } } } printf("NO RESULT"); return 0; }
-
1
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1e5+5; struct pt{ int sum; pt* ch[2]; }; typedef pt* ptr; ptr root[maxn]; int n,k; void add(ptr last,ptr& th,int v,int l=1,int r=n){ th=new pt; *th=*last; th->sum=last->sum+1; if(l==r)return ; int mid=l+r>>1; if(v<=mid)add(last->ch[0],th->ch[0],v,l,mid); else add(last->ch[1],th->ch[1],v,mid+1,r); } int getid(ptr le,ptr re,int k,int l=1,int r=n){ if(l==r)return l; int tmp=re->ch[0]->sum-le->ch[0]->sum; int mid=l+r>>1; if(k<=tmp)return getid(le->ch[0],re->ch[0],k,l,mid); else return getid(le->ch[1],re->ch[1],k-tmp,mid+1,r); } int a[maxn]; int main(){ ptr& null=root[0]; null=new pt; null->ch[0]=null->ch[1]=null;null->sum=0; cin>>n>>k; for(int i=1;i<=n;++i){ cin>>a[i]; } sort(a+1,a+1+n); n=unique(a+1,a+1+n)-a-1; if(k>n){ cout<<"NO RESULT"<<endl; return 0; } for(int i=1;i<=n;++i){ add(root[i-1],root[i],i); } cout<<a[getid(root[0],root[n],k)]<<endl; return 0; }
-
0
简单的权值线段树就可以了,不必用主席树。
#include <algorithm> #include <cstdio> #include <iostream> using namespace std; const int MAXN = 10005; int n, k, a[MAXN]; int tree[MAXN << 1], lc[MAXN << 1], rc[MAXN << 1], root = 0, tot = 0; void build(int &rt, int l, int r) { rt = ++tot; if (l == r) return; int m = (l + r) >> 1; build(lc[rt], l, m); build(rc[rt], m + 1, r); } void update(int rt, int l, int r, int q) { if (l == r) { tree[rt] = 1; return; } int m = (l + r) >> 1; if (q <= m) update(lc[rt], l, m, q); else update(rc[rt], m + 1, r, q); tree[rt] = tree[lc[rt]] + tree[rc[rt]]; } int kth(int rt, int l, int r, int k) { if (l == r) return l; int m = (l + r) >> 1; if (k > tree[lc[rt]]) return kth(rc[rt], m + 1, r, k - tree[lc[rt]]); return kth(lc[rt], l, m, k); } int main() { cin >> n >> k; build(root, 1, n); for (int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); n = unique(a + 1, a + 1 + n) - a - 1; if (k > n) { cout << "NO RESULT\n"; return 0; } for (int i = 1; i <= n; i++) { update(root, 1, n, i); } cout << a[kth(root, 1, n, k)] << endl; return 0; }
-
-1
使用 std::sort 排序,并使用 std::unique 去重即可。
#include <bits/stdc++.h> using namespace std; int main() { int n, a[10005], k; cin >> n >> k; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n); n = unique(a, a + n) - a; if (k >= n) { cout << "NO RESULT" << endl; } else { cout << a[--k] << endl; } return 0; }
- 1
信息
- ID
- 139
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 38
- 已通过
- 20
- 上传者