【ACM】杭电OJ 1862

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/84452166

用了三个快速排序的子函数进行排序,排序结束后,再从头循环,判断成绩或者姓名是否相同。 

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

const int maxn =100000 + 100;


typedef struct one_person_info
{
	int id;
	string name;
	int grade;
}N;

N stu[maxn];

void quick_sort1(int left,int right)
{
	int i,j;
	i=left;j=right;
	if(left<right)
	{
		stu[0]=stu[i];
		while(i!=j)
		{
			while(stu[0].id<stu[j].id && i<j)	j--;
			if(i<j)
			{
				stu[i]=stu[j];
				i++;
			}
			while(stu[0].id>stu[i].id && i<j)	i++;
			if(i<j)
			{
				stu[j]=stu[i];
				j--;
			}
		}
		stu[i]=stu[0];
		quick_sort1(left,i-1);
		quick_sort1(i+1,right);
	}
}

void quick_sort2(int left,int right)
{
	int i,j;
	i=left;j=right;
	if(left<right)
	{
		stu[0]=stu[i];
		while(i!=j)
		{
			while(stu[0].name<stu[j].name && i<j)	j--;
			if(i<j)
			{
				stu[i]=stu[j];
				i++;
			}
			while(stu[0].name>stu[i].name && i<j)	i++;
			if(i<j)
			{
				stu[j]=stu[i];
				j--;
			}
		}
		stu[i]=stu[0];
		quick_sort2(left,i-1);
		quick_sort2(i+1,right);
	}
}

void quick_sort3(int left,int right)
{
	int i,j;
	i=left;j=right;
	if(left<right)
	{
		stu[0]=stu[i];
		while(i!=j)
		{
			while(stu[0].grade<stu[j].grade && i<j)	j--;
			if(i<j)
			{
				stu[i]=stu[j];
				i++;
			}
			while(stu[0].grade>stu[i].grade && i<j)	i++;
			if(i<j)
			{
				stu[j]=stu[i];
				j--;
			}
		}
		stu[i]=stu[0];
		quick_sort3(left,i-1);
		quick_sort3(i+1,right);
	}
}
int num;

int main ()
{
	char s[10];
	int n,C,i,j,len,left,right;
	while(scanf("%d%d",&n,&C)==2)
	{
		if(n==0 && C==0)	return 0;
		num++;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&stu[i].id);
			cin>>stu[i].name;
			scanf("%d",&stu[i].grade);
		}
		printf("Case %d:\n",num);
		if(C==1)
		{
			quick_sort1(1,n);
			for(i=1;i<=n;i++)
			{
				itoa(stu[i].id,s,10);
				len=strlen(s);
				for(j=1;j<=6-len;j++)	
					printf("0");
				printf("%d ",stu[i].id);
				cout<<stu[i].name;
				printf(" %d\n",stu[i].grade);
			}
		}
		else if(C==2)
		{
			quick_sort2(1,n);
			i=1;
			while(i<n)
			{
				if(stu[i].name==stu[i+1].name)
				{
					left=i;
					while(stu[i].name==stu[i+1].name) i++;
					right=i;
					quick_sort1(left,right);
				}
				i++;
			}
			for(i=1;i<=n;i++)
			{
				itoa(stu[i].id,s,10);
				len=strlen(s);
				for(j=1;j<=6-len;j++)	
					printf("0");
				printf("%d ",stu[i].id);
				cout<<stu[i].name;
				printf(" %d\n",stu[i].grade);
			}
		}
		else if(C==3)
		{
			quick_sort3(1,n);
			i=1;
			while(i<n)
			{
				if(stu[i].grade==stu[i+1].grade)
				{
					left=i;
					while(stu[i].grade==stu[i+1].grade) i++;
					right=i;
					quick_sort1(left,right);
				}
				i++;
			}
			for(i=1;i<=n;i++)
			{
				itoa(stu[i].id,s,10);
				len=strlen(s);
				for(j=1;j<=6-len;j++)	
					printf("0");
				printf("%d ",stu[i].id);
				cout<<stu[i].name;
				printf(" %d\n",stu[i].grade);
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/84452166