5 条题解

  • 1
    @ 2024-3-27 0:52:35

    最短代码有没有?

    #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
      @ 2023-4-8 20:17:06

      用计数排序

      # 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
        @ 2022-7-17 21:43:15
        #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
          @ 2022-8-14 8:48:37

          简单的权值线段树就可以了,不必用主席树。

          #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
            @ 2021-10-2 16:04:54

            使用 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
            上传者