OJ-NOI 1.10 05:分数线划定(sort排序+结构体)

http://noi.openjudge.cn/ch0110/05/
这道题比较简单,主要由两部分
1、按成绩排序,成绩相同按序号排序
2、计算目标多少人,划分数线,然后根据成绩与最后分数线相等,给出具体多少人

我的代码

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

int k[5005], s[5005];//k号码,s分数
int main()
{
	int n, m;//n报名人数,m录取人数
	cin >> n >> m;
	int i = 0;
	
	//冒泡排序
	for (i = 0; i < n; i++)
	{
		cin >> k[i] >> s[i];
	}
	int j = 0, w = 0;
	int temp;
	for (j = n - 1; j > 0; j--)
	{
		for (w = 0; w < j; w++)
		{
			if (s[w] < s[w + 1])
			{
				temp = s[w];
				s[w] = s[w + 1];
				s[w + 1] = temp;

				temp = k[w];
				k[w] = k[w + 1];
				k[w + 1] = temp;
			}
			if (s[w] == s[w + 1])
			{
				if (k[w] > k[w + 1])
				{
					temp = k[w];
					k[w] = k[w + 1];
					k[w + 1] = temp;
				}
			}
		}
	}

	//划分数线
	int tag_i = m * 1.5;
	int tag_s = s[tag_i - 1];
	i = tag_i - 1;
	while(s[i]==tag_s)
	{		
		i++;
	}
	cout << tag_s << " " << i << endl;
	for (j = 0; j < i; j++)
	{
		cout << k[j] << " " << s[j] << endl;
	}

	return 0;
}

我采用的是冒泡排序+数组,一开始我一直8分,后来发现是
int tag_i = m * 1.5;
int tag_s = s[tag_i ]; //错误
中我认为 tag_i 对应的分数就是分数线,但由于我的数组是从0开始的,所以应该是tag_i - 1 对应的分数是分数线。

参考代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
struct s
{
int num;
int score; 
};
int n,m,x;
s a[5010];
int cmp(const s &a,const s &b)
{
if(a.score>b.score)return 1;
else if(a.score<b.score)return 0;
else
{
if(a.num<b.num)return 1;
else return 0;
}
}
using namespace std;
int main()
{
scanf("%d%d",&n,&m);
x=m*1.5;
for(int i=1;i<=n;i++)
cin>>a[i].num>>a[i].score;
sort(a+1,a+n+1,cmp);
while(a[x].score==a[x+1].score)x++;
cout<<a[x].score<<" "<<x<<endl;
for(int i=1;i<=x;i++)
cout<<a[i].num<<" "<<a[i].score<<endl;
return 0;
}

参考代码采用 sort排序+结构体
值得学习的地方

  • 结构体进行定义,这样交换的时候就会方便许多
  • 采用sort函数排序,在cmp中规定先按成绩,再按序号排序的方式
    关于sort函数https://www.cnblogs.com/stones-dream/p/10183210.html
    cmp也可以定义为bool型,形参是const 结构名 &,实参是数组名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值