hdu 1862

背景;第二次比赛b题,感觉就是代码题,对结构体数组按不同元素排序,自然就写了三个快速排序,第一次尝试这么长的代码,感觉hold不足,单步调试了很多次终于过了。以前看过某位大牛说:每个人的一次调过代码行数是不断增长的,他曾经过了200行的代码就容易出问题,说明他当时的代码能力在200行,那我现在大概100行吧。

学习:1.主要是对结构体数组和快速排序的巩固。

2.我250行代码,结果会长40行代码搞定,sort和cmp要掌握。从会长这段代码里可以看出cmp写法

会长代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
int n, c;
struct Student{
    int no, grade;
    char name[10];
}st[100009];/*学生信息结构体数组*/
bool cmp1(Student s0, Student s1){
    return s0.no < s1.no;/*学号升序排列*/ 
}
bool cmp2(Student s0, Student s1){
    if(strcmp(s0.name, s1.name) == 0) return s0.no < s1.no;/*如果名字相同,就按学号升序排列*/
    return strcmp(s0.name, s1.name) == -1;/*这里设置比较巧妙,s1字典序高于s0就返回真*/ 
}
bool cmp3(Student s0, Student s1){
    if(s0.grade == s1.grade) return s0.no < s1.no;
    return s0.grade < s1.grade;
}
int main(){
    int cas = 0;
    while(scanf("%d %d", &n, &c) == 2 && (n|c)){/*n,c同时为零就退出*/ 
        for(int i=0;i<n;i++) scanf("%d %s %d", &st[i].no, st[i].name, &st[i].grade);/*输入n组数据*/ 
        if(c == 1) std::sort(st, st+n, cmp1);/*algorithm中的文件就是要用using namespace std;否则每次应用都要std::*/
        else if(c == 2) std::sort(st, st+n, cmp2);
        else std::sort(st, st+n, cmp3);
        printf("Case %d:\n", ++cas);
        for(int i=0;i<n;i++)
            printf("%06d %s %d\n", st[i].no, st[i].name, st[i].grade);
    }
}

我的代码:

#include<stdio.h>
#include<string.h>
struct student
{
	int xh;
	char name[9];
	int score;
}s[100009];
void qsort(struct student str[],int n);
void qsortscore(struct student str[],int n);
void qsortstr(struct student str[],int n);

  void qsort(struct student str[],int n)
  {
  	int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score;
	char key[9];
	for(int i=0;i<9;i++)
	{
		key[i]=str[p1].name[i];
	}
  	if(p1<p2)
	{
		while(p1<p2)
		{
			for(;p2>p1;p2--)
			{
				if(keyxh>str[p2].xh)
				{
					for(int i=0;i<9;i++)
					{
						str[p1].name[i]=str[p2].name[i];
					}
					str[p1].xh=str[p2].xh;
					str[p1].score=str[p2].score;
					p1++;
					break;
				}
			}
			for(;p2>p1;p1++)
			{
				if(str[p1].xh>keyxh)
				{
					for(int i=0;i<9;i++)
					{
						str[p2].name[i]=str[p1].name[i];
					}
					str[p2].xh=str[p1].xh;
					str[p2].score=str[p1].score;
					p2--;
					break;
				}
			}
		}
		str[p1].score=keyscore;
		str[p1].xh=keyxh;
		for(int i=0;i<9;i++)
			{
				str[p1].name[i]=key[i];
			}
		qsort(str,p1);
		qsort(str+p1+1,n-p1-1);
  	}
  }
  
  void qsortstr(struct student str[],int n)
  {
  	int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score;
	char key[9];
	for(int i=0;i<9;i++)
	{
		key[i]=str[p1].name[i];
	}
  	if(p1<p2)
	{
		while(p1<p2)
		{
			for(;p2>p1;p2--)
			{
				if(strcmp(key,str[p2].name)>0)
				{
					for(int i=0;i<9;i++)
					{
						str[p1].name[i]=str[p2].name[i];
					}
					str[p1].xh=str[p2].xh;
					str[p1].score=str[p2].score;
					p1++;
					break;
				}
				else if(strcmp(key,str[p2].name)==0)
				{
					if(keyxh>str[p2].xh)
					{
						for(int i=0;i<9;i++)
					{
						str[p1].name[i]=str[p2].name[i];
					}
					str[p1].xh=str[p2].xh;
					str[p1].score=str[p2].score;
						p1++;
						break;
					}
				}
			}
			for(;p2>p1;p1++)
			{
				if(strcmp(key,str[p1].name)<0)
				{
					for(int i=0;i<9;i++)
					{
						str[p2].name[i]=str[p1].name[i];
					}
					str[p2].xh=str[p1].xh;
					str[p2].score=str[p1].score;
					p2--;
					break;
				}
				else if(strcmp(key,str[p1].name)==0)
				{
					if(keyxh<str[p1].xh)
					{
						for(int i=0;i<9;i++)
					{
						str[p2].name[i]=str[p1].name[i];
					}
					str[p2].xh=str[p1].xh;
					str[p2].score=str[p1].score;
					p2--;
					break;
					}
				}
			}
		}
		str[p1].score=keyscore;
		str[p1].xh=keyxh;
		for(int i=0;i<9;i++)
			{
				str[p1].name[i]=key[i];
			}
		qsortstr(str,p1);
		qsortstr(str+p1+1,n-p1-1);
  	}
  }

int main(void)
{
	int n,c;
	int x=0;
	while(scanf("%d %d",&n,&c)!=EOF&&n&&c)
	{
		++x;
		for(int i=0;i<n;i++)
	    {
	    	scanf("%d %s %d",&s[i].xh,s[i].name,&s[i].score);
	    }
	    if(c==1)
	    {
	    qsort(s,n);	
	    }
	    else if(c==2)
	    {
	    	qsortstr(s,n);	
	    }
	    else
	    {
	    	qsortscore(s,n);
	    }
	    printf("Case %d:\n",x);
	    for(int k=0;k<n;++k)
	    {
	    printf("%06d %s %d\n",s[k].xh,s[k].name,s[k].score);	
	    }
	}
}

  void qsortscore(struct student str[],int n)
  {
  	int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score;
	char key[9];
	for(int i=0;i<9;i++)
	{
		key[i]=str[p1].name[i];
	}
  	if(p1<p2)
	{
		while(p1<p2)
		{
			for(;p2>p1;p2--)
			{
				if(keyscore>str[p2].score)
				{
					for(int i=0;i<9;i++)
					{
						str[p1].name[i]=str[p2].name[i];
					}
					str[p1].xh=str[p2].xh;
					str[p1].score=str[p2].score;
					p1++;
					break;
				}
				else if(keyscore==str[p2].score)
				{
					if(keyxh>str[p2].xh)
					{
						for(int i=0;i<9;i++)
					{
						str[p1].name[i]=str[p2].name[i];
					}
					str[p1].xh=str[p2].xh;
					str[p1].score=str[p2].score;
					p1++;
					break;
					}
				}
			}
			for(;p2>p1;p1++)
			{
				if(keyscore<str[p1].score)
				{
					for(int i=0;i<9;i++)
					{
						str[p2].name[i]=str[p1].name[i];
					}
					str[p2].xh=str[p1].xh;
					str[p2].score=str[p1].score;
					p2--;
					break;
				}
				else if(keyscore==str[p1].score)
				{
					if(keyxh<str[p1].xh)
					{
						for(int i=0;i<9;i++)
					{
						str[p2].name[i]=str[p1].name[i];
					}
					str[p2].xh=str[p1].xh;
					str[p2].score=str[p1].score;
					p2--;
						break;
					}
				}
			}
		}
		str[p1].score=keyscore;
		str[p1].xh=keyxh;
		for(int i=0;i<9;i++)
			{
				str[p1].name[i]=key[i];
			}
		qsortscore(str,p1);
		qsortscore(str+p1+1,n-p1-1);
  	}
  }


你可能感兴趣的:(简单)