数组排序基础(C++)

第1题     求数位上的数字     时限:1s 空间:256m

老师给出了两个整数NK,让桐桐求出K次方的结果中的十位数和个位数的数字。请你帮帮桐桐。

输入格式

2个整数N, K2NK100000000 )。

输出格式

两个整数。

输入/输出例子1

输入:

3  6

输出:

2  9

样例解释

3^6=729 

#include<bits/stdc++.h>
using namespace std;
long long f(long long yuans,long long mi){
    long long ans,t;
    ans=1;
    t=yuans;
    while(mi!=0){
        if(mi%2==1)ans=ans*t%100;
        t=t*t%100;
        mi/=2;
    }
    return ans;
}
long long n,k;
int main(){
    cin>>n>>k;
    cout<<f(n,k)/10<<" "<<f(n,k)%10;
	return 0;
}

第2题     橘子排队     时限:1s 空间:256m

秋天到了,同学们去橘子园摘橘子。张老师要求同学们把摘好的橘子去掉一个最大的,再去掉一个最小的的橘子,求出剩余的橘子的平均重量,并将剩余的橘子按照由轻到重排序。

输入格式

第一行是橘子的数量n。(1≤n≤200)
第二行是n个正整数,表示这些橘子的重量,数据范围为[1,1000]。

输出格式

第一行输出剩余橘子的平均重量,结果保留1位小数。
第二行输出剩余橘子按照由轻到重排序后的结果。

输入/输出例子1

输入:

5
9 1 2 1 8

输出:

3.7
1 2 8

#include<bits/stdc++.h>
using namespace std;
long long n,a[99999],maxx=0,minn=99999;
double s=0;
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++){
		s+=a[i];
		if(a[i]>maxx)maxx=a[i];
		if(a[i]<minn)minn=a[i];
	}
	s-=maxx;
	s-=minn;
	s=s/(n-2);
	printf("%.1lf\n",s);
	for(int i=2;i<n;i++){
		cout<<a[i]<<" ";
	}
    return 0;
}

第3题     平均分     时限:1s 空间:256m

期末考试结束了,黄老师需要计算一下,本班同学们的语文成绩,如果去掉x个最高分和x个最低分,剩余同学的平均分是多少分,请你编程计算一下?

输入格式

第一行有两个整数n和x,n代表分数的总数,x代表要去掉的最高分和最低分的数量(10<=n<=10000,x<n/4)
第二行有n个整数,代表n个同学的分数,数据范围为[0,100]

输出格式

n个分数去掉x个最高分和x个最低分后的平均分,结果保留1位小数

输入/输出例子1

输入:

8 2
1 8 2 6 6 5 3 4

输出:

4.5

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,x,a[10000+5],s=0,c=0,z=0;
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s=s+a[i];
    }
    sort(a+1,a+n+1);
    for(int i=n;i>=n-x+1;i--){
        c=c+a[i];
    }
    for(int i=1;i<=x;i++){
        z=z+a[i];
    }   
    s=s-c-z;
    double w=n-x*2;
    double s1=s/w*1.0;    
	cout<<fixed<<setprecision(1)<<s1;
    return 0;
}

第4题     中位数     时限:1s 空间:256m

中位数指的是一组数,如果按照大小排序排好后最中间的那个数的值,如果有偶数个元素,那么就是最中间两个数的平均数!

比如:2 5 8 1 6,排序后的结果为1 2 5 6 8,那么这组数的中位数就是5!

再比如:8 9 1 2 3 0,排序后的结果为0 1 2 3 8 9,那么这组书的中位数就是(2+3)/2=2.5  

输入格式

第一行:一个整数n代表有n个数(n≤100000)

第二行:n个数的值,数据范围为[0,100]

输出格式

中位数(结果保留1位小数)

输入/输出例子1

输入:

5
2 5 8 1 6

输出:

5.0

#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],t=0;
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
	sort(a+1,a+n+1);
    if(n%2==0){
    	printf("%.1lf",(a[n/2]+a[n/2+1])/2.0); 
    }
    else {
    	printf("%.1lf",a[n/2+1]/1.0);
    }
    return 0;
}

第5题     宇航局招聘     时限:1s 空间:256m

宇航局准备招收一批科研人员从事月球探索的航空科研工作。这个职位来了很多应聘者,宇航局对众多应聘者进行综合素质考试,最终会选出x名综合得分排名靠前应聘者。目前考试已经结束了,宇航局需要根据目前考试的成绩计算出,如果要选出x个分数靠前的人,分数线应该划到多少分?请你写一个程序来帮助宇航局计算分数线。
比如:如果有10名选手参加考试,他们的得分如下
100 99 98 97 96 95 94 93 92 91 90
如果要选出3名分数靠前的人,那么分数线应该划在98分。

输入格式

第一行是一个整数n,代表参加考试的人数(n<=1000)
第二行有n个整数,用空格隔开,代表n个人的考试分数(注意:不存在成绩一样的分数)
第三行有一个整数x(x < n),代表宇航局要选出的人数

输出格式

一个整数,代表如果要选出x个人,宇航局应当划出的分数线。

输入/输出例子1

输入:

8
100 90 98 92 85 70 88 96
2

输出:

98

#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y){
	return x>y;
}
long long n,a[10000],k;
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
    	scanf("%lld",&a[i]);
	}
	scanf("%lld",&k);
    sort(a+1,a+n+1,cmp);
    cout<<a[k];
    return 0;
}

第6题     5-5 排名     时限:1s 空间:256m

一年一度的NH小学生程序设计比赛结束啦!组委会公布了所有学生的成绩。现在HuangYongCong想设计一个程序,先将成绩从高到低排,成绩相同则按年级从低到高排,然后查询每个学生有多少人的排名比他高并且年级还低于他?

输入格式

一行一个正整数n(1<=n<=200),表示参赛人数。

第2~n+1行,每行两个正整数,s(0<=s<=400)、g(1<=g<=6),之间用一个空格隔开,分别表示学生的成绩和年级。

输出格式

n行,每行只有一个正整数,其中第i行表示排第i名的学生前面有k个学生排名比他高,且年级比他低。

输入/输出例子1

输入:

5

300  5

200  6

350  4

400  6

250  5

输出:

0

0

1

1

3

#include<bits/stdc++.h>
using namespace std;
long long n,a[10005],b[10005],s;
int main(){
    scanf("%lld",&n); 
    for(int i=1;i<=n;i++){
    	scanf("%lld%lld",&a[i],&b[i]);
	}
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[i]<a[j]){
                swap(a[i],a[j]),swap(b[i],b[j]);
            }
            else if(a[i]==a[j]){
	                if(b[i]>b[j]){
	                    swap(a[i],a[j]),swap(b[i],b[j]);
	                }
            }
        }
    }
    cout<<0<<endl;
    for(int i=2;i<=n;i++){
        s=0;
        for(int j=i;j>=1;j--){
            if(b[j]<b[i])s++;
        }
        cout<<s<<endl;
    }
    return 0;
}

第7题     成绩排序     时限:1s 空间:256m

现有 N(N≤1000) 名同学参加了期末考试,学号依序为1~n。现在老师获得了这1~n号同学的信息:语文、数学、英语成绩(均为不超过 150 的自然数)。请你按成绩降序的顺序输出每位学生各项信息(学号、各科成绩)。如果有多个总分相同的学生,学号小的先输出。

输入格式

第1行输入n;

第2行到n+1行输入三科成绩。

输出格式

成绩降序的顺序输出每位学生各项信息(学号、各科成绩)。如果有多个总分相同的学生,学号小的先输出。

输入/输出例子1

输入:

3

114 51 4 

114 10 23 

51 42 60

输出:

1 114 51 4
3 51 42 60

2 114 10 23 

输入/输出例子2

输入:

3

100 100 100

120 120 120 

100 100 100

输出:

2 120 120 120

1 100 100 100

3 100 100 100

#include<bits/stdc++.h>
using namespace std;
struct str{
	int cj,xh,x1,x2,x3;
}a[99999]; 
bool f(str x,str y){
	if(x.cj!=y.cj)return x.cj>y.cj;
	else return x.xh<y.xh;
}
int n,s,s1,s2;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s>>s1>>s2;
		a[i].x1=s;
		a[i].x2=s1;
		a[i].x3=s2;
		a[i].cj=s+s1+s2;
		a[i].xh=i;
	}
	sort(a+1,a+n+1,f);
	for(int i=1;i<=n;i++){
		cout<<a[i].xh<<" "<<a[i].x1<<" "<<a[i].x2<<" "<<a[i].x3<<endl;
	}
	return 0;
}

第8题     整数奇偶排序 2     时限:1s 空间:256m

输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求:
1.先输出其中的奇数,并按从大到小排列;
2.然后输出其中的偶数,并按从小到大排列。

输入格式

任意排序的10个整数(0~100),彼此以空格分隔。

输出格式

可能有多组测试数据,对于每组数据,按照要求排序后输出,由空格分隔。

输入/输出例子1

输入:

0 56 19 81 59 48 35 90 83 75

17 86 71 51 30 1 9 36 14 16

输出:

83 81 75 59 35 19 0 48 56 90

71 51 17 9 1 14 16 30 36 86

样例解释

多组数据,注意输出格式
1. 测试数据可能有很多组,请使用while(cin>>a[0]>>a[1]>>...>>a[9])类似的做法来实现;
2. 输入数据随机,有可能相等。

#include<bits/stdc++.h>
using namespace std;
int n=10,a[1005];
int main(){
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]>>a[10]){
		sort(a+1,a+n+1);
		for(int i=n;i>=1;i--){
			if(a[i]%2==1)cout<<a[i]<<" "; 
		} 
		for(int i=1;i<=n;i++){
			if(a[i]%2==0)cout<<a[i]<<" "; 
		} 
		cout<<endl;
	}
	return 0;
}

第9题     一种排序     时限:1s 空间:256m

现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);
1.按照编号从小到大排序
2.对于编号相等的长方形,按照长方形的长排序;
3.如果编号和长都相同,按照长方形的宽排序;
4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形。

输入格式

第一行有一个整数 0<n<10,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,
第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000)。

输出格式

顺序输出每组数据的所有符合条件的长方形的 编号

输入/输出例子1

输入:

1

8

1 1 1

1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

输出:

1 1 1

1 2 1

1 2 2

2 1 1

2 2 1

#include<bits/stdc++.h>
using namespace std;
long long n,m,i,j,t,a[10000][30];
int main(){
	scanf("%lld",&n);
	while(n--){
		scanf("%lld",&m);
		for(i=0;i<m;i++){ 
			scanf("%lld%lld%lld",&a[i][0],&a[i][1],&a[i][2]);
			if(a[i][1]<a[i][2]){
				t=a[i][1];
				a[i][1]=a[i][2];
				a[i][2]=t;
			}
			for(j=0;j<i;j++){
				if(a[i][0]==a[j][0]&&a[i][1]==a[j][1]&&a[i][2]==a[j][2])
					a[i][0]=0; 
			}
		}
		for(i=0;i<m;i++){ 
			if(a[i][0]!=0){
				for(j=i+1;j<m;j++){
					if((a[i][0]>a[j][0])||(a[i][0]==a[j][0]&&a[i][1]>a[j][1])||(a[i][0]==a[j][0]&&a[i][1]==a[j][1]&&a[i][2]>a[j][2])){
						t=a[i][0],a[i][0]=a[j][0],a[j][0]=t,t=a[i][1],a[i][1]=a[j][1],a[j][1]=t,t=a[i][2],a[i][2]=a[j][2],a[j][2]=t;
					}
				}
			}
		}
		for(i=0;i<m;i++){
			if(a[i][0]!=0)printf("%lld %lld %lld\n",a[i][0],a[i][1],a[i][2]);
		}
	}
   return 0;
}

第10题     兔子     时限:1s 空间:256m

明明家养了N只兔子,边上种植了很多胡萝卜。平时兔子都被关在一个大笼子里,每天明明喂每只兔子3根胡萝卜。某天饿疯了的兔子们咬坏了笼子门,跑到地里尽情地吃起胡萝卜。每只兔子的“吃货值”不一样,已知第i只兔子每分钟吃Ei个胡萝卜。明明1分中后发现了情况,急忙开始捉拿这些兔子,已知明明每分钟可以捉一只,请问明明怎样捉才能使得被兔子吃最少的胡萝卜。计算出被兔子吃最少胡萝卜的个数。例如:N=2, E1=4,E2=5;明明第1个捉第2个兔子(这个兔子已经吃了5根胡萝卜),第2个捉第1个兔子(这个兔子已经吃了8根胡萝卜),共被兔子吃了13根兔子。

输入格式

第一行: 1 个正整数 N。N的范围[1…100]
第二行 N 个正整数: 表示 N 只兔子每分钟可以吃的胡萝卜数,每个数的范围[1…1000000]。

输出格式

一个整数,表示最少要被吃掉多少胡萝卜。

输入/输出例子1

输入:

3
2 1 3

输出:

10

#include<bits/stdc++.h>
using namespace std;
bool f(int a,int b){
	return a>b;
}
long long n,a[100005],h=0,t=0,s=0;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n,f);
    for(int i=1;i<=n;i++){
        t++;
	    s=s+a[i]*t;	
    }
    cout<<s;
    return 0;
}

第11题     兔子     时限: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;
int n,j,a[100005],s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	}
    sort(a+1,a+1+n);
    if(n%2==0){
    	j=n/2;
	}
    else{
    	j=n/2+1;
	}
    for(int i=1;i<=n;i++){
    	s=s+abs(a[i]-a[j]);
	}
	cout<<s;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值