C++ sort排序的综合应用题

第1题     sort排序1      时限:1s 空间:256m

输入n个数,将这n个数从小到大排序,输出。

输入格式

1行,一个正整数nn<=100

2行,n个正整数,小于100

输出格式

n个整数,空格隔开

输入/输出例子1

输入:

5

1 5 2 8 3

输出:

1 2 3 5 8

#include<bits/stdc++.h>
using namespace std;
long long n,a[200];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}
第2题     sort排序2      时限:1s 空间:256m

输入n个数,将这n个数从大到小排序,输出。

输入格式

1行,一个正整数nn<=100

2行,n个正整数,小于100

输出格式

n个整数,空格隔开

输入/输出例子1

输入:

5

1 5 2 8 3

输出:

8 5 3 2 1

#include<bits/stdc++.h>
using namespace std;
long long n,a[200];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=n;i>=1;i--)
        cout<<a[i]<<" ";
    return 0;
}
第3题     兔子      时限:5s 空间:256m

从左往右有100000001个整数点,分别是整数点0至整数点100000000。

n只兔子,第i只兔子在整数点d[i]。你需要选择一个整数点作为喂食点,所有兔子都要走到这个整数点进食。

应该如何选择喂食点,才能使得所有兔子走过的总路程最小?

输出最小的总路程。

输入格式

第一行,一个整数。1<=n<=20。

第二行,共n个整数,第i个整数是d[i]。0<=d[i]<=100000000。

【提示】

对于60%的数据, 1<=n<=3且0<=d[i]<=10。

对于80%的数据, 1<=n<=10且0<=d[i]<=100。

输出格式

一个整数

输入/输出例子1

输入:

3

5  9  1

输出:

8

#include<bits/stdc++.h>
using namespace std;
long long n,a[50],x,s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    if(n%2==1)x=a[n/2+1];
    else x=(a[n/2]+a[n/2+1])/2;
    for(int i=1;i<=n;i++)
    s=s+abs(a[i]-x);
    cout<<s;
    return 0;
}
第4题     糖果      时限:1s 空间:256m

n个小朋友,有m袋糖果,第i袋的糖果数量是a[i]。已知n<=m<2n。

每个小朋友至少要有一袋糖果,至多只能要两袋糖果。

分配的目标是把这m袋糖果全部分完,而且要使得每个小朋友最终得到的糖果数量都是相等的。

如果可以做到则输出”possible”,如果做不到则输出”impossible”。

注意:不能拆开一个袋子的糖果,必须整袋整袋的分配。

输入格式

第一行,一个正整数R,表示有R组测试数据。1<=R<=10。

每组测试数据的格式是:

第一行,两个整数n和m。1<=n<=50。n<=m<2n。

第二行,m个整数,第i个整数是a[i]。1<=a[i]<=1000。

输出格式

R行,每行一个字符串,”possible”或者”impossible”,双引号不用输出。

输入/输出例子1

输入:

3

1 1

47

3 5

10 8 10 1 1

3 5

3 9 10 7 1

输出:

possible

impossible

possible

#include<bits/stdc++.h>
using namespace std;
long long n,c,d;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int b=1,q=1,s=0,a[200]={0};
        cin>>c>>d;
        for(int i=1;i<=d;i++)
        {
            cin>>a[i];
            s=s+a[i];
        }
        if(s%c!=0)
        {
            cout<<"impossible"<<endl;
            continue;
        }
        else 
        {
            sort(a+1,a+d+1);
            for(int j=d;j>=b;j--)
            {
                if(a[j]==s/c)continue;
                if(a[j]+a[b]==s/c)
                {
                    b++;
                    continue;
                }
                if(a[j]>s/c)
                {
                    q=-1;
                    break;
                }
                q=-1;
                break;
            }
            if(q==-1)
        	{
            	cout<<"impossible"<<endl;
            	continue;
        	}
        	else cout<<"possible"<<endl;
        }
    }
    return 0;
}
第5题     中间数(med)     时限:1s 空间:256m

在统计学的世界中,中间数(median)扮演一个重要的角色。 根据定义:中间数就是在一连串已由小到大排序的数字中,排在中间的那一个数。例如:在{1,3,4,9,11}4就是中间数。若有偶数个数字,我们定义中间数就是位于中间的那2个数的和除以2(而且只取整数部分)。例如:在{1,2,3,6,7,8}{3,6}是位于中间的2个数,所以中间数就是(3+6)/2=4

输入格式

第一行一个数为整数NN<=30000),表示有N个整数。
从第二行开始,有N个整数,有一空格隔开。

输出格式

仅一行,输出这些数的中间数。

输入/输出例子1

输入:

6

1 3 4 2 3 27

输出:

3

#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000005];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>a[i];
    sort(a+1,a+n+1);
    if(n%2==1)cout<<a[n/2+1];
    else cout<<(a[n/2+1]+a[n/2])/2;
    return 0;
}
第6题     合唱队形      时限:1s 空间:256m

茵茵所在的合唱队共有 个人(n为奇数)。为了准备一次演出,老师开始为她们安排合唱队形了。
大家都知道,合唱队形通常是中间高两端低的。老师是这样安排他们的队形的:先让所有的同学按高个儿在前的顺序排成一队。然后,最高的那位同学单独站出来,这是合唱队形的中心,再让第二位同学站在她的左手边,让第三位同学站在她的右手边,再依次向两端安排其他人……
事先给定所有人的身高,请输出她们站成合唱队形之后的身高顺序。

输入格式

文件第一行是一个整数n,表示合唱队的总人数,已知n为奇数,且n<50 
文件第二行是n个整数,表示以厘米为单位的所有人的身高。

输出格式

文件中只有n个整数,表示她们按老师的要求站成合唱队形之后的身高顺序。

输入/输出例子1

输入:

7
154 160 157 162 159 152 163

输出:

152 157 160 163 162 159 154

#include<bits/stdc++.h>
using namespace std;
long long n,a[100],b[100],s=1;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    b[n/2+1]=a[n];
    for(int i=1;i<=n/2;i++)
    {
    	b[i]=a[s],b[n-i+1]=a[1+s],s+=2;
	}
	for(int i=1;i<=n;i++)
	cout<<b[i]<<" ";
    return 0;
}
第7题     求值(simple)     时限:1s 空间:256m

给出N个整数X1X2X3XN,将这N个数从小到大排序为:A1A2A3AN,记数列A1A2A3AN的奇数项之和为P,偶数项之和为Q,令T=|P-Q|求出T的值。(T=|P-Q|表示T等于P-Q的绝对值。)

图片.png

输入格式

输入文件的第一行为整数N1<=N<=50000
接下来的N行每行有一个整数,按顺序给出X1X2X3XN的值(|Xi|<=1000

输出格式

输出整数T的值。

输入/输出例子1

输入:

3

1

3

2

输出:

2

#include<bits/stdc++.h>
using namespace std;
long long n,s1,s2,a[50005];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(i%2==1)s1=s1+a[i];
        else s2=s2+a[i];
    }
    cout<<abs(s1-s2);
    return 0;
}
第8题     学生代表(perfect)      时限:1s 空间:256m

根据上级文件的通知,晨晨学校要挑选一个学生代表,参加区学生代表大会。学校领导想根据学生们平时的表现,找到一个各方面表现都比较平均的学生参加。
刚好,学生根据平时的表现都有自己的德育操行分r (1<=r<=1000),为了尽快找到这名代表,学校领导把学生排成n×n (2<=n<=99, n为奇数)队列,他叫每一行的同学找出自己行的德育操行分在中间位置的同学(所谓中间位置也就是行里面有一半的同学的操行分大于或等于这个学生的操行分数,并且同时有一半的学生的操行分小于或等于这个学生的操行分数)。然后,在每一行中间位置的这些学生中再次找出处于中间位置的那个学生。那么这个学生就是最后参加学生代表大会的学生了。
给出n×n的学生队列,找到其中的学生代表的操行分数。

输入格式

第一行:一个整数n
2..n+1行:每一行有n个整数,分别代表这一行里面每个学生的操行分。

输出格式

一个整数,学生代表的操行分数。

输入/输出例子1

输入:

5
1 5 3 9 5
2 5 3 8 1
6 3 5 9 2
8 8 3 3 2
5 4 4 4 4

输出:

4

样例解释

样例说明:第一行中间位置的为5,第二行为3、第三行为5、第四行为3、第五行为4
然后在5 3 5 3 4中找到中间位置为4

#include<bits/stdc++.h>
using namespace std;
long long n,a[200],b[200];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cin>>a[j];
        sort(a+1,a+n+1);
        b[i]=a[n/2+1];
        for(int j=1;j<=n;j++)
            a[j]=0;
    }
    sort(b+1,b+n+1);
    cout<<b[n/2+1];
    return 0;
}
第9题     课程(course)      时限:1s 空间:256m

N个整数,你要求出这N个数当中前K小的总和。

输入格式

第一行,一个整数G,表示有G组测试数据。1 <= G <= 5
每组测试数据格式如下:
第一行,NK。 1 <= N <= 1000。 1 <= K <= N
第二行,N个整数,每个整数范围【1,1000】。

输出格式

G行。每行一个整数。

输入/输出例子1

输入:

3
4 2
1 5 3 4
3 3
1 5 4
5 1
2 2 4 5 3

输出:

4
10
2

#include<bits/stdc++.h>
using namespace std;
long long m,n,w,a[2000];
int main(){
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int s=0;
        cin>>n>>w;
        for(int j=1;j<=n;j++)
            cin>>a[j];
        sort(a+1,a+n+1);
        for(int j=1;j<=w;j++)
            s=s+a[j];
        cout<<s<<endl;
        for(int j=1;j<=n;j++)
            a[j]=0;
    }
    return 0;
}
第10题     小头速算     时限:1s 空间:256m

小头是个聪明的孩子,但同时他也很馋嘴。这天,他又在对着一堆糖果发呆了。妈妈看见了很生气,于是她对小头说:"这里一共有n个糖果,每个糖果有一个价值c,如果你能算出这堆糖果中价值最大的糖果,加上价值第3大的糖果,加上价值第5大的糖果,……一直加到价值第n大的糖果,他们的价值和是多少,那么妈妈就把这堆糖果奖励给你。另外妈妈保证n是奇数且所有糖果的价值都不相等。"

原本这个问题对于小头来说只是小菜一碟,但是在美味的糖果面前,小头的智商瞬间降为负值,连1+1都变成了绝世难题。于是好心的你决定发挥雷锋精神,帮助小头算出答案。

输入格式

第一行一个正整数n,表示有n个糖果(n≤1000)

接下来n行,每行一个正整数,表示糖果的价值

输出格式

一个正整数,表示要求的价值和


 

输入/输出例子1

输入:

5

4

9

3

1

6

输出:

14

#include<bits/stdc++.h>
using namespace std;
long long n,a[1005],s;
int m(int z,int x)
{
    return z>x;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1,m);
    for(int i=1;i<=n;i++)
        if(i%2==1)s=s+a[i];
    cout<<s;
    return 0;
}
第11题     成绩排序     时限:1s 空间:256m

输入n个同学的语文、数学、和英语成绩,计算他们的总分,要求按从高到低的顺序输出总分。

输入格式

第一行:输入1个正整数n(3≤n≤1000),表示学生总数;

第2到n+1行,每行输入3个正整数,表示每个同学语文、数学、英语的分数。

输出格式

只有一行:按从高到低的顺序输出成绩。

输入/输出例子1

输入:

10

100 100 98

100 100 100

100 96 95

85 96 45

100 85 96

100 98 96

96 75 89

79 65 86

96 89 79

100 100 85

输出:

300 298 294 291 285 281 264 260 230 226

#include<bits/stdc++.h>
using namespace std;
long long s[2000],n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        s[i]=a+b+c;
    }
    sort(s+1,s+n+1);
    for(int i=n;i>=1;i--)
        cout<<s[i]<<" ";
    return 0;
}
第12题     研究数列     时限:1s 空间:256m

摇摇最爱研究和发明东西了,这不,它又研究起来数列了。

输入格式

共2行,第一行输入1个整数N(1<=n<=5000),第二行输入N个整数。

输出格式

输出这堆整数的从小到大排,从大到小排,倒序输出,还有求出这堆整数中的最大数,最小数。


 

输入/输出例子1

输入:

5

    2 6 9 3 5

输出:

    2 3 5 6 9

    9 6 5 3 2

    5 3 9 6 2

    9

    2

#include<bits/stdc++.h>
using namespace std;
long long n,a[5005],b[5005];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    for(int i=n;i>=1;i--)
        cout<<a[i]<<" ";
    cout<<endl;
    for(int i=n;i>=1;i--)
        cout<<b[i]<<" ";
    cout<<endl;
    cout<<a[n]<<endl<<a[1];
    return 0;
}
第13题     分组     时限:1s 空间:256m

有n个球员,现在要把他们分成两队,让他们打比赛。每个人都有一个技巧值,有两个教练,教练A和教练B,这两个教练轮流挑选球员,这两个教练每次都是从当前剩下的球员中挑选技巧值最大的球员。第一次是教练A先挑选。当教练A和教练B挑完球员后,问:教练A挑选的球员的技巧总和比教练B挑选的球员的技巧总和大多少?

例如:有5个球员,技巧值分别是:{5,7,8,4,2},那么教练A先选8,教练B选7,教练A选5,教练B选4,教练A选2。最后教练A选到的总和是:15,教练B选到的总和是:11,所以你应该输出4。


 

输入格式

第一行:1个整数n(1≤n≤50);

第二行:n个非负整数,第i个整数表示第i个球员的技巧值,技巧值不超过10000。

输出格式

1个整数,教练A挑选的球员的技巧总和比教练B挑选的球员的技巧总和大多少。


 

输入/输出例子1

输入:

4

9 8 7 6

输出:

2

第14题     一半     时限:1s 空间:256m

n个数,保存在数组a[1...n],每次挑选数组当中的最大的一个数(如果有多个数都是最大的,随便挑选其中的一个最大数),

把该数变成原来的一半(向下取整,例如最大的数是5,那么会变成2),经过m次这样的操作之后,把a数组所有的数从小到大输出。

输入格式

第一行,两个整数,nm1<=n<=100,  1<=m<=10^9

第二行,n个整数,第i个整数是a[i],  0<=a[i]<=10^9

输出格式

一行,n个整数,从小到大的次序输出,相邻两个数之间输出一个空格。

输入/输出例子1

输入:

6 4

1 2 3 21 5 4 

输出:

1 2 2 2 3 4 

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1000];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=m;i++)
    {
        if(a[n]==0)break;//一定要加这一步,否则会超时
        a[n]=a[n]/2;
        sort(a+1,a+n+1);
    }
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值