纯C语言写,Devc++可过样例,这里非WA即RE
查看原帖
纯C语言写,Devc++可过样例,这里非WA即RE
1312574
apcipot_rain楼主2024/5/9 21:53

代码如下,注释写的很清楚了吧,求回答,大一生只会纯C语言。或者能否给几个其他测试样例?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct banggong
{
	char name[1000];
	char job[100];
	long contribution;
	int grade;
	int postpos;//记录输入顺序 
};
void myscanf(char a[], struct banggong* p, int num);
void Sort1(struct banggong* p, int n);
void Adjustjob(struct banggong* p, int n);
void Sort2(struct banggong* p, int a, int b);//排序的上下限
void Sort3(struct banggong* p, int a, int b);
int main()
{
	int n;
	char temp[1000];
	scanf("%d", &n);
	getchar();
	struct banggong* p = (struct banggong*)malloc(n * sizeof(struct banggong));
	for (int i = 0; i < n; i++) {
		gets(temp);
		myscanf(temp, p, i);//将整体读入的字符串转化为字符串数据 
	}
	Sort1(p, n);//对着帮贡排序
	Adjustjob(p, n);//调整职位 
	Sort2(p, 1, 2);//在同职位的情况下对着等级排序,护法 
	Sort2(p, 3, (4 < n - 1) ? 4 : (n - 1));//在同职位的情况下对着等级排序,护法 
	Sort2(p, 5, (8 < n - 1) ? 8 : (n - 1));//长老 
	Sort2(p, 9, (15 < n - 1) ? 15 : (n - 1));//堂主
	Sort2(p, 16, (40 < n - 1) ? 40 : (n - 1));//精英
	Sort2(p, 41, n);//帮众 

	for (int i = 0; i < n - 1; i++)
		printf("%s %s %d\n", p[i].name, p[i].job, p[i].grade);
	printf("%s %s %d", p[n - 1].name, p[n - 1].job, p[n - 1].grade);
	free(p);
	return 0;
}
void myscanf(char a[], struct banggong* p, int num)
{
	long x = 0;
	int y = 0, count = 0, i = 0;
	for (i = 0; a[i] != ' '; i++)//读到空格停止 
		p[num].name[i] = a[i];
	count += (i + 1);//count记录位置 
	p[num].name[i] = '\0';

	for (i = 0; a[i + count] != ' '; i++)//读到空格停止 
		p[num].job[i] = a[i + count];
	count += (i + 1);//count记录位置 
	p[num].job[i] = '\0';

	for (i = 0; a[i + count] != ' '; i++)//读到空格停止 
		x = x * 10 + (a[i + count] - '0');//读贡献 
	count += (i + 1);//count记录位置 
	p[num].contribution = x;

	for (i = 0; a[i + count] != '\0'; i++)
		y = y * 10 + (a[i + count] - '0');//读等级 
	p[num].grade = y;
	p[num].postpos = num + 1;
}
void Sort1(struct banggong* p, int n)
{
	int i, j, k, tg, tp;//tc交换贡献,tg交换等级,tp交换位置顺序 
	long tc;
	char tname[50];//tname交换名字 
	for (i = 3; i < n - 1; i++) {
		k = i;
		for (j = i + 1; j < n; j++)
			if (p[k].contribution < p[j].contribution) k = j;
		if (k != i) {
			tc = p[k].contribution;
			p[k].contribution = p[i].contribution;
			p[i].contribution = tc;
			tg = p[k].grade;
			p[k].grade = p[i].grade;
			p[i].grade = tg;
			tp = p[k].postpos;
			p[k].postpos = p[i].postpos;
			p[i].postpos = tp;
			strcpy(tname, p[k].name);
			strcpy(p[k].name, p[i].name);
			strcpy(p[i].name, tname);
		}
	}
}
void Adjustjob(struct banggong* p, int n)
{
	int i = 1;
	for (i = 1; i < n; i++) {
		if (i == 0) strcpy(p[i].job, "BangZhu");
		else if (i == 1 || i == 2) strcpy(p[i].job, "FuBangZhu");
		else if (i == 3 || i == 4) strcpy(p[i].job, "HuFa");
		else if (i >= 5 && i <= 8) strcpy(p[i].job, "ZhangLao");
		else if (i >= 9 && i <= 15) strcpy(p[i].job, "TangZhu");
		else if (i >= 16 && i <= 40) strcpy(p[i].job, "JingYing");
		else if (i > 40) strcpy(p[i].job, "BangZhong");
	}
}
void Sort2(struct banggong* p, int a, int b)
{
	if (a >= b) return;
	int i, j, k, tg, tp;
	long tc;
	char tname[50];
	int count[1000] = { 0 };//等级桶
	for (i = a; i <= b - 1; i++)//上下限对着等级排序 
	{
		k = i;
		for (j = i + 1; j <= b; j++)
			if (p[k].grade < p[j].grade) k = j;
		if (k != i) {
			tc = p[k].contribution;
			p[k].contribution = p[i].contribution;
			p[i].contribution = tc;
			tg = p[k].grade;
			p[k].grade = p[i].grade;
			p[i].grade = tg;
			tp = p[k].postpos;
			p[k].postpos = p[i].postpos;
			p[i].postpos = tp;
			strcpy(tname, p[k].name);
			strcpy(p[k].name, p[i].name);
			strcpy(p[i].name, tname);
		}
	}
	for (i = a; i <= b; i++)
		count[p[i].grade]++;
	int ans = 0;
	for (i = 150; i >= 0; i--)
	{
		if (count[i] == 1) ans++;
		else if (count[i] >= 2) Sort3(p, a + ans, a + ans + count[i]);
	}
}
void Sort3(struct banggong* p, int a, int b)
{
	if (a >= b) return;
	int i, j, k, tg, tp;
	long tc;
	char tname[50];
	for (i = a; i < b - 1; i++)//上下限对着等级排序 
	{
		k = i;
		for (j = i + 1; j < b; j++)
			if (p[k].postpos > p[j].postpos) k = j;
		if (k != i) {
			tc = p[k].contribution;
			p[k].contribution = p[i].contribution;
			p[i].contribution = tc;
			tg = p[k].grade;
			p[k].grade = p[i].grade;
			p[i].grade = tg;
			tp = p[k].postpos;
			p[k].postpos = p[i].postpos;
			p[i].postpos = tp;
			strcpy(tname, p[k].name);
			strcpy(p[k].name, p[i].name);
			strcpy(p[i].name, tname);
		}
	}
}
2024/5/9 21:53
加载中...