DS的苦恼 数组 排序

本文介绍了一个通过算法实现女生分数快速排名的解决方案。面对大量数据的处理需求,该算法利用了高效的计数和累加策略,实现了快速查找指定位置女生的排名。此方法适用于诸如比赛评分等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

DS因为善于目测打分而全校闻名,于是被东大女生节组委会请去给参加校花比赛的女生打分。
DS也果然名不虚传,大眼一扫便对眼前站成一排的n个参赛女生依次打出了分数a1,a2...an(ai为整数,0<=ai<=100,1<=i<=n,分数越高越好)。但组委会不仅要知道每个女生的分数还要知道每个女生排名,于是要求DS回答m个询问,每个询问为一个整数i,要求回答从左到右第i个女生的排名(分数最高的排第一)。DS擅长打分但智力有硬伤,于是找到你,想请你帮忙解决这个苦恼他的问题。并且,DS保证如果你能解决他的苦恼,他将会把最终校花的联系方式告诉你。

输入

多组数据
每组三行
第一行为两个整数n,m  1<=n<=100000 1<=m<=10000
第二行为n个正整数,从左到右依次为每个女生的分数 0<=ai<=100
第三行为m个正整数,每个整数i表示从左到右第i个女生 0<i<=n

输出

每组数据输出m行,依次为每次询问的回答
相邻数据组之间空一行

样例输入

5 2
1 2 3 4 5
2 5

样例输出

4
1


#include <iostream>
#include <cstring>
using namespace std ;   

#define MAX 100001
#define MAXN 101  
int a[MAX]; 
int s[MAXN]; 
 
int main()
{
	int n,m,t,b,p;   
	while(cin>>n>>m){  
		memset(s,0,sizeof(s));  
		t=1; 
		for (int i=1;i<=n;i++)
		{ 
			cin>>a[i];   
			s[a[i]]++;    
		}   
		for (int i=100;i>=0;i--) 
		{ 
			if (s[i]!=0)
			{  
				p=s[i]; 
				s[i]=t; 
				t+=p;   
			} 
		}
		for (int i=0;i<m;i++)
		{ 
			cin>>b;  
			cout<<s[a[b]]<<endl; 
		}
		cout<<endl; 
	}
	return 0; 
}


### 折半插入排序算法详解 折半插入排序是一种改进的插入排序方法,其基本思想是在每一步将待排序元素通过二分查找的方式找到合适的位置并插入其中。这种方法减少了比较次数,在一定程度上提高了效率。 #### 算法原理 在传统的插入排序中,为了给新元素腾出位置,通常需要逐个向前移动较大的元素。而折半插入排序则采用二分查找来定位插入点,从而减少不必要的比较操作[^1]。 对于长度为n的数组A,从第二个元素开始遍历到第n个元素: - 对于当前处理的元素`key=A[i]`,在其之前已经完成排序的部分序列`A[0...i-1]`里寻找合适的插入位置p; - 使用二分查找确定位置p; - 将位于p及其之后直到i-1处的所有元素向右平移一位; - 插入`key`至位置p。 此过程重复执行直至整个列表有序化结束。 #### Python 实现代码 下面是基于上述逻辑编写的Python版本折半插入排序函数: ```python def binary_search(arr, val, start, end): # 执行二分查找以获得要插入的位置 while start <= end: mid = (start + end)//2 if arr[mid] < val: start = mid + 1 elif arr[mid] > val: end = mid - 1 else: return mid return start def insertion_sort_with_binary_search(array): for i in range(1, len(array)): value_to_insert = array[i] insert_position = binary_search(array, value_to_insert, 0, i-1) # 移动较大值并向后覆盖 j = i - 1 while j >= insert_position : array[j+1]=array[j] j -= 1 # 插入目标数值 array[insert_position] = value_to_insert return array ``` 该实现方式不仅保持了原有插入排序稳定性特点,还因为采用了更有效的搜索策略使得性能有所提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值