1015 德才论 (25 分)

1015 德才论 (25 分),第1张

1015 德才论 (25 分)
#include
typedef struct student
{
	int id;
	int de;
	int cai;
} STU;
//void maopao(STU a[], int length);
void print1(STU a[], int length);
void print2(STU a[], int length);
void qsort(STU a[], int begin, int end);
STU level1[1000000], level2[100000], level3[100000], level4[100000];
int main(void)
{	//1.读入三个数
	int N, L, H;
	scanf_s("%d %d %d", &N, &L, &H);
	//2.设置4个结构数组
	STU link;
	//3.判断后读入数组
	int cnt = 1, cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
	int fail = 0;
	for (cnt = 1; cnt <= N; cnt++)
	{
		scanf_s("%d %d %d", &link.id, &link.de, &link.cai);
		if (link.de >= L && link.cai >= L)
		{
			if (link.de >= H && link.cai >= H)
			{
				level1[cnt1] = link;
				cnt1++;
			}
			if (link.de >= H && link.cai < H)
			{
				level2[cnt2] = link;
				cnt2++;
			}
			if (link.de < H && link.cai < H && link.de >= link.cai)
			{
				level3[cnt3] = link;
				cnt3++;
			}
			if (link.de < H && link.cai > link.de)
			{
				level4[cnt4] = link;
				cnt4++;
			}
		}
		else
		{
			fail++;
			continue;
		}
	}
	cnt1--;
	cnt2--;
	cnt3--;
	cnt4--;
	//4.对每个数组冒泡排序
	qsort(level1, 0, cnt1);
	qsort(level2, 0, cnt2);
	qsort(level3, 0, cnt3);
	qsort(level4, 0, cnt4);
	//5.开始输出
	printf("%dn", N - fail);
	print1(level1, cnt1);
	print1(level2, cnt2);
	print1(level3, cnt3);
	print2(level4, cnt4);
	return 0;
}

//void maopao(STU a[], int length)
//{
//	int i, j;
//	struct student temp;
//	for (i = 0; i <= length - 1; i++)
//	{
//		for (j = i + 1; j <= length; j++)
//		{
//			if (a[i].de + a[i].cai < a[j].de + a[j].cai)
//			{
//				temp = a[i];
//				a[i] = a[j];
//				a[j] = temp;
//			}
//			if (a[i].de + a[i].cai == a[j].de + a[j].cai)
//			{
//				if (a[i].de > a[j].de)
//				{
//
//				}
//				if (a[i].de < a[j].de)
//				{
//					temp = a[i];
//					a[i] = a[j];
//					a[j] = temp;
//				}
//				if (a[i].de == a[j].de)
//				{
//					if (a[i].id > a[j].id)
//					{
//						temp = a[i];
//						a[i] = a[j];
//						a[j] = temp;
//					}
//				}
//			}
//		}
//	}
//}

void print1(STU a[], int length)
{
	int count;
	for (count = 0; count <= length; count++)
	{
		printf("%d %d %dn", a[count].id, a[count].de, a[count].cai);
	}
}

void print2(STU a[], int length)
{
	int count;
	for (count = 0; count <= length - 1; count++)
	{
		printf("%d %d %dn", a[count].id, a[count].de, a[count].cai);
	}
	if (count == length)
	{
		printf("%d %d %d", a[count].id, a[count].de, a[count].cai);
	}
}

void qsort(STU a[], int begin, int end)
{
	if (begin > end)
		return;
	int left = begin;
	int right = end;
	int key = a[begin].de + a[begin].cai;
	STU key2 = a[begin];
	while (begin < end)
	{
		for (; a[end].de + a[end].cai <= key && begin < end; end--)
		{
			if (a[end].de + a[end].cai == key && a[end].de > key2.de)
				break;
			if (a[end].de + a[end].cai == key && a[end].de == key2.de && a[end].id < key2.id)
				break;

		}
		a[begin] = a[end];
		for (; a[begin].de + a[begin].cai >= key && begin < end; begin++)
		{
			if (a[begin].de + a[begin].cai == key && a[begin].de < key2.de)
				break;
			if (a[begin].de + a[begin].cai == key && a[begin].de == key2.de && a[begin].id > key2.id)
				break;
		}
		a[end] = a[begin];
	}
	a[begin] = key2;
	int keyi = begin;
	qsort(a, left, keyi - 1);
	qsort(a, keyi + 1, right);
}

1.读取三个数字

2.设置4个结构数组

根据题目要求 数组会很大 如果只放在main函数里会导致数组过大而报错

因而参考vs给出得到解决方案和csdn 将结构数组设置为全局变量 这样就可以使数组很大

3.判断后读入数组

判断比较好搞 就是要好好读清楚题目 然后将数据分配进对应数组

4.进行数组内排序

这是这道题的最大收获 前面的内容都还是偏基础 只要好好读题同时有一定的动手能力就行

但这个部分就要求用算法 还是优化的排序算法 这样才能达到时间要求

在尝试冒泡排序无效后 我们直接自学快速排序的递归版

在学习排序时也积累了一些经验 我们移步另一个博客

总之这个算法算是学到了 并且实现了简单学习到复杂使用

5.输出加输出格式

格式的话这次我也直接用用函数来表示了 比较省空间 

以后也应该学会多多使用函数 这样其实是可以便于检查哪个部分出了差错 且在更改部分方案的时候也很有帮助

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3971078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存