2019暑假集训(第二天)- 数据排序

数据排序

  • https://blog.nowcoder.net/sylvie

1.明明的随机数(NOIP2006)

在这里插入图片描述

题目解析:

  • 需要先对输入的数据进行去重,然后对输入的数据进行排序

代码

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

const int N = 1000;
int a[N];
int n;
int main()
{
    while(cin>> n){
        memset(a, 0, sizeof a);
        int res = 0;
        while(n--){
            int x;
            cin>> x;
            a[x] = 1;
            
        }
        // 去重hash 排序sort
        for(int i = 1; i <= N; i++){
            if(a[i] == 1) res++;
        }
        cout<< res << endl;
      
        for(int i = 1; i <= N; i++){
            if(a[i] == 1){
                if(i != N) cout<< i <<" ";
                else cout<< i << endl;
            } 
        }
    }
    return 0;
}
  • https://blog.csdn.net/qq_41114451/article/details/85038583

2. 车厢重组 (carry)

在这里插入图片描述

题意: 只能交换两个数,并对数组进行排序, 问交换最少的步数(冒泡排序)

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

const int N = 10010;
int a[N];
int n;
int main()
{
    cin>> n;
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    int res = 0;
    for(int i = 0; i < n; i++){
        for(int j = i; j < n; j++){
            if(a[i] > a[j]) swap(a[i], a[j]), res ++;
        }
    }
    cout<< res << endl;
    return 0;
}
  • https://blog.csdn.net/xiaofang3a/article/details/24625509
  • https://blog.csdn.net/FGFGFG2018/article/details/80355395

3.众数(masses)

在这里插入图片描述

解析

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

const int N = 10010;
int a[N];
int n;
int main()
{
    cin>> n;
    memset(a, 0, sizeof a);
    
    for(int i = 0; i < n; i++){
        int x;
        cin>> x;
        a[x]++;
    }
    int res = 0;
    for(int i = 0; i < n; i++){
        if(res < a[i]) res = a[i];
    
    }
    for(int i = 0; i < n; i++){
        if(res == a[i]){
            cout<< i <<" " << a[i] << endl;
        }
    }


    return 0;
}

4.第k小整数(knumber)

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[10000],k;
    cin>>n>>k;
    for(int i=0;i<n;++i)
    cin>>a[i];
    sort(a,a+n);
    int len=unique(a,a+n)-a;
    if(k<len)cout<<a[k-1];
    else cout<<"NO RESULT";
    return 0;
}

  • https://blog.csdn.net/gz153016/article/details/81710312

5. 军事机密(secret)

在这里插入图片描述

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a[40000] = { 0 };
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    sort(a, a + n);
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int tmp;
        cin >> tmp;
        cout << a[tmp - 1] <<endl;
    }
    return 0;
}
  • 参考文章: https://blog.csdn.net/weixin_40427089/article/details/78710508

6. 奖学金(NOIP2007)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<algorithm>
#define maxn 300
using namespace std;
struct tnode{int s,c,b;}a[maxn+20];
int n;
 
bool cmp(tnode x,tnode y)
{
  if(x.s>y.s)return 1;
  if(x.s<y.s)return 0;
  if(x.c>y.c)return 1;
  if(x.c<y.c)return 0;
  return x.b<y.b;
}
 
int main()
{
  int i,j,k,x,y,z;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    {
      scanf("%d%d%d",&x,&y,&z);
      a[i].s=x+y+z,a[i].c=x,a[i].b=i;
    }
  sort(a+1,a+n+1,cmp);
  for(i=1;i<=5;i++)printf("%d %d\n",a[i].b,a[i].s);
  return 0;
}
  • 参考文章:https://blog.csdn.net/yuyanggo/article/details/48572153

7. 统计数字(NOIP2007)

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
long long n,b;
map<long long,long long>a;
int c[100000000];
long long maxx=-10000000;
long long box;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&b);
        if(a[b]==0) c[++box]=b;
        a[b]++;
    }
    sort(c,c+1+box);
    for(int i=1;i<=box;i++)
    {
        printf("%d %d\n",c[i],a[c[i]]); 
    }
    
    
}

参考文章: https://www.cnblogs.com/liaoshuangqi/p/10768144.html

8. 输油管道问题(pipe)

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
void quickSort(int l, int r, int *data) {
    if(l>=r) {
        return;
    }
    int m = data[(l+r)/2];//中间的那个
    int i=l;
    int j=r;
    while(i<=j){//等号!!!
        while(data[i]<m)//从左找比中间的那个大的 不要等号!!!
            i++;
        while(data[j]>m)//从右找比中间的那个小的
            j--;
        if(i<=j){//交换
            int tmp = data[i];
            data[i]=data[j];
            data[j]=tmp;
            i++;
            j--;
        }
    }//循环结束表示一趟已执行完
    if(l<j)
        quickSort(l, j, data);
    if(r>i)
        quickSort(i, r, data);
}
 
int main() {
    int n;
    int x[100000], y[100000];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x[i];
        cin>>y[i];
    }
    quickSort(0, n-1, y);
    int Y;
    if(n%2)
        Y = (y[n/2-1]+y[n/2])/2;
    else
        Y = y[n/2];
    int res=0;
    for(int i=0;i<n;i++)
        res+=abs(y[i]-Y);
    cout<<res<<endl;
    return 0;
}

参考文章:https://blog.csdn.net/nico2333/article/details/88900442

9. 士兵站队问题

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdlib>
using namespace std;
 
const int MAXN = 10000;
int num,x[MAXN],y[MAXN],x1[MAXN];
 
int cmp(const void *a,const void *b)
{
  return *(int *)a - *(int *)b;
}
 
int far(int x,int y)
{
  return x > y ? x-y : y-x;
}
 
int main()
{
  int i,n,sum = 0;
  cin>>n;
  for(i = 0; i < n; i++)
    cin>>x[num]>>y[num++];
  qsort(x,num,sizeof(int),cmp);
  qsort(y,num,sizeof(int),cmp);
  int y_place = y[num/2];
  for(i = 0; i < num; i++)
    x1[i] = x[i] - i;
  qsort(x1,num,sizeof(int),cmp);
  int x_place = x1[num/2];
  for(i = 0; i < num; i++)
    sum += far(x1[i],x_place) + far(y[i],y_place);
  cout<<sum<<endl;
  return 0;
}

参考文章:https://blog.csdn.net/air_one/article/details/12677175

发布了114 篇原创文章 · 获赞 98 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/github_39533414/article/details/98223262