zoukankan      html  css  js  c++  java
  • 每日一水之 luoguP1138 第k小整数

    题目描述

    现有n个正整数,n≤10000,要求出这n个正整数中的第k个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于30000。

    输入输出格式

    输入格式:

    第一行为n和k; 第二行开始为n个正整数的值,整数间用空格隔开。

    输出格式:

    第k个最小整数的值;若无解,则输出“NO RESULT”。

    输入输出样例

    输入样例#1:
    10 3
    1 3 3 7 2 5 1 2 4 6
    
    输出样例#1:
    3
    

    说明

    n≤10000

    解析:

    1.模拟跑一遍:

     1 #include <bits/stdc++.h> 
     2 using namespace std;
     3 int a[10001],b[30001];
     4 int main() {
     5     int n,k,m=0;
     6     cin>>n>>k;
     7     for(int i=1; i<=n; i++)
     8         cin>>a[i];
     9     sort(a+1,a+n+1);
    10     for(int i=1; i<=n; i++)
    11         b[a[i]]=1;
    12     for(int i=1; i<=a[n]; i++)
    13         if(b[i]==1) {
    14             m++;
    15             if(m==k) {
    16                 cout<<i;
    17                 return 0;
    18             }
    19         }
    20     cout<<"NO RESULT";
    21     return 0;
    22 }
    View Code

    2.桶排序,相同的只记一次:

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int main() {
     5     int i,j=1,k,h,n,m;
     6     cin>>n>>k;
     7     int a1[n+1],x[10001],a[n+1];
     8     for(i=1; i<=10000; i++)
     9         x[i]=0;
    10     for(i=1; i<=n; i++) {
    11         cin>>a1[i];
    12         x[a1[i]]++;
    13     }
    14     for(i=1; i<=10000; i++) {
    15         if(x[i]!=0) {
    16             a[j]=i;
    17             j++;
    18         }
    19     }
    20     sort(a+1,a+j);
    21     if(k>j-1)
    22         cout<<"NO RESULT";
    23     else
    24         cout<<a[k];
    25     return 0;
    26 }
    View Code

    3.STL算法大法好:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 int a[10001];
     8 int main() {
     9     int n,k;
    10     cin>>n>>k;
    11     for(int i=1;i<=n;i++) {
    12         scanf("%d",&a[i]);
    13     }
    14     sort(a+1,a+1+n);
    15     unique(a+1,a+1+n);
    16     int tot=0;
    17     for(int i=1;;i++) {
    18         if(a[i]<=a[i-1])break;
    19         ++tot;
    20     }
    21     if(k>tot)printf("NO RESULT");
    22     else printf("%d",a[k]);
    23     return 0;
    24 }
    View Code

    4.跑的稍微慢点的优先队列:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <queue>
     5 #include <vector>
     6 using namespace std;
     7 priority_queue<int,vector<int>,greater<int> > q;
     8 int main() {
     9     int n,k,ans,u=-233;
    10     scanf("%d%d",&n,&k);
    11     for(int i=1;i<=n;i++) {
    12         int a;
    13         scanf("%d",&a);
    14         q.push(a);
    15     }
    16     while(k) {
    17         if(q.empty()) {
    18             printf("NO RESULT");
    19             return 0;
    20         }
    21         ans=q.top();
    22         if(u!=ans) k--;
    23         u=ans;
    24         q.pop();
    25     }
    26     printf("%d",ans);
    27     return 0;
    28 }
    View Code

    ps:每日一水有利于身体健康哦ovo

  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/suki_rem/p/7354890.html
Copyright © 2011-2022 走看看