洛谷水题 记录

本文记录了洛谷中涉及奖学金问题的算法题目,包括NOIP2007普及组的奖学金排序和NOIP2005提高组的奖学金分配问题,以及一个简单的平台问题。解决方案主要采用排序和循环遍历的方法,需要注意比较函数的编写和特定条件的处理。

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

P1093 [NOIP2007 普及组] 奖学金
sort排序即可
注意cmp的写法

#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int id;
int chinese;
int math;
int english;
int count;
}a[305];
int cmp(node& a,node& b)
{
	if(a.count!=b.count){return a.count>b.count;}
	else if(a.chinese!=b.chinese){return a.chinese>b.chinese;}
	return a.id<b.id;

}
int main()
{
int n,i;
int count=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i].chinese;
cin>>a[i].math;
cin>>a[i].english;
a[i].count=a[i].chinese+a[i].math+a[i].english;
a[i].id=i+1;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
cout<<a[i].id<<" "<<a[i].count<<endl;
if(++count==5)
{
break;
}
}
return 0;
}

P1051 [NOIP2005 提高组] 谁拿了最多奖学金
也是排序即可

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct node
{
string name;
int stu_money;
int id;
}stu[105];
int getm(int n,int m){
if(n>80&&m>=1){
return 8000;}
else{
return 0;}}
int geta(int m,int n)//a
{
if(m>85&&n>80)
{return 4000;}
else{return 0;}
}
int getb(int m)//b
{
if(m>90){return 2000;}
else
{return 0;}
}

int getc1(int m,char n)//c
{
if(m>85&&n=='Y')
{
return 1000;
}else{
	return 0;}
}
int getd(int m,char n)//d
{
if(m>80&&n=='Y')
{
return 850;
}else
{
return 0;
} 
}
bool cmp(node a,node b)
{
	if(a.stu_money!=b.stu_money){
		return a.stu_money>b.stu_money;}
	else
	{
	return a.id<b.id;
	}
}
int main()
{
int n,i;
string stu_name;
int stu_ALLcount=0;
cin>>n;
for(i=0;i<n;i++)
{
char stu_gan=' ';
char stu_w=' ';
int score=0;
int ju_score=0;
int count=0;
cin>>stu[i].name;
cin>>score;
cin>>ju_score;
cin>>stu_gan;
cin>>stu_w;	
cin>>count;
stu[i].id=i;
stu[i].stu_money=getm(score,count)+geta(score,ju_score)+getb(score)+getc1(score,stu_w)+getd(ju_score,stu_gan);
stu_ALLcount+=stu[i].stu_money;
}
sort(stu,stu+n,cmp);
cout<<stu[0].name<<endl;
cout<<stu[0].stu_money<<endl;
cout<<stu_ALLcount<<endl;
return 0;
}

P1105 平台
没什么难度,循环便利即可(注意条件,初始化)。

#include<iostream>
using namespace std;
struct node
{
int id;
int h;
int r;
int l;
}a[1005];
int main()
{int n,i,j;
cin>>n;
for(i=0;i<n;i++){
cin>>a[i].h;
cin>>a[i].l;
cin>>a[i].r;
a[i].id=i+1;}
int lflag=-1,rflag=-1;
int lmin=200000;
int rmin=200000;

for(i=0;i<n;i++){
lmin=200000;
rmin=200000;
for(j=0;j<n;j++){
if(a[i].h>a[j].h&&a[i].l>a[j].l&&a[i].l<a[j].r&&lflag>=-1){
	if(lmin>(a[i].h-a[j].h)){
		lmin=a[i].h-a[j].h;
		lflag=j;}}
if(a[i].h>a[j].h&&a[i].r>a[j].l&&a[i].r<a[j].r&&rflag>=-1){
	if(rmin>(a[i].h-a[j].h)){
		rmin=a[i].h-a[j].h;
		rflag=j;
}}}
if(lflag==-1){cout<<"0"<<" ";}
else {cout<<a[lflag].id<<" ";lflag=-1;}
if(rflag==-1){cout<<"0"<<endl;}
else {cout<<a[rflag].id<<endl;rflag=-1;}}
return 0;}
### 关于洛谷平台上的排序算法练习目及其Python实现 在洛谷平台上存在一系列针对排序算法设计的编程挑战,这些目不仅有助于理解不同类型的排序方法,还能够提升解决实际问的能力。以下是几个推荐给学习者的经典排序算法,并附带简单的Python实现思路。 #### 1. 快速排序 (Quick Sort) 快速排序是一种高效的分治法排序算法,在平均情况下具有O(n log n)的时间复杂度。对于这个问,可以通过选择数组中的某个元素作为“基准”,然后将小于等于该基准值的所有元素移动至其左侧,大于它的则放置在其右侧来完成一次划分操作。之后递归地对左右两部分继续执行相同的操作直到整个序列有序[^1]。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` #### 2. 插入排序 (Insertion Sort) 插入排序适用于较小规模的数据集或几乎已排序的情况。它通过构建有序序列的方式工作——每次从未处理的部分取出一个记录并将其插入到前面已经排好序的位置上。此过程不断重复直至所有数据都被处理完毕[^4]。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` #### 3. 堆排序 (Heap Sort) 堆排序利用二叉堆这种特殊形式的最大/最小堆性质来进行排序。首先建立最大(或最小)堆,接着依次交换根节点与最后一个叶子结点位置并将新的子树重新调整成合法的堆形态,如此循环往复最终得到完全升序排列的结果。 ```python import heapq def heap_sort(arr): h = [] for value in arr: heapq.heappush(h, value) return [heapq.heappop(h) for _ in range(len(h))] ``` #### 4. 归并排序 (Merge Sort) 归并排序也是一种基于分治策略的经典排序技术。它先将待排序列分成若干个小片段分别独立排序后再逐步合并相邻的小段形成更大的有序区间,直至全部合成为一个完整的有序表为止。 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_half = merge_sort(arr[:mid]) right_half = merge_sort(arr[mid:]) merged_arr = [] l_idx, r_idx = 0, 0 while l_idx < len(left_half) and r_idx < len(right_half): if left_half[l_idx] < right_half[r_idx]: merged_arr.append(left_half[l_idx]) l_idx += 1 else: merged_arr.append(right_half[r_idx]) r_idx += 1 merged_arr.extend(left_half[l_idx:]) merged_arr.extend(right_half[r_idx:]) return merged_arr ``` 以上就是在洛谷网站上可以尝试的一些基本排序算法以及它们对应的简单Python代码示例。当然还有更多有趣的排序目等待探索!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值