HDU1862EXCEL排序

其实最近都没有兴趣做排序题目,因为我觉得纯粹排序对我而言进步不大,但是舍友TLE了,叫我试一试。

整道题的思路很简单啦,我用的是快排,比较的原则也给得很清楚,不必多言,我没有用stdlib的快排,也没有用scanf,printf等IO,因为我觉得没什么必要啦。

当然,如果用了程序当然会更快~

我甚至有点觉得这题目是模拟题……CE一次,没包括string头文件,之后就AC了。

/*******************************************************************************/
/* OS           : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
 * Compiler     : g++ (GCC)  4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
 * Encoding     : UTF8
 * Date         : 2014-03-26
 * All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/

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

class student{
    public:
    string id ;
    string name;
    int score;
    student(string i,string n,int s){
      id=i;
      name=n;
      score=s;
    }
    student (){}
    student & operator=(const student& tmp){
     this->id=tmp.id;
       this->name=tmp.name;
     this->score=tmp.score;
      return *this;
    }
    void show(){
       cout<<id<<" "<<name<<" "<<score<<endl;
    }
};
student stu[100001];
bool isBig1(student &s1,student &s2){
    for(int i=0;i<6;i++)
       if(s1.id[i]>s2.id[i]) return 0;
       else if(s1.id[i]<s2.id[i]) return 1;


   return 0;
}
bool isBig2(student &s1,student &s2){
    int len1=s1.name.length();
    int len2=s2.name.length();
    int min=len1>len2?len2:len1;
    if(s1.name==s2.name){
       return isBig1(s1,s2);
    }

    for(int i=0;i<min;i++){
        if(s1.name[i]>s2.name[i]) return 0;
        else if(s1.name[i]<s2.name[i]) return 1;
    }
    if(len1>len2){
       return 0;
    }else if(len1<len2){
       return 1;
    }

   return 0;
}
bool isBig3(student &s1,student &s2){

   if(s1.score==s2.score){
     return isBig1(s1,s2);
   }
   return s1.score<s2.score;
}
int partition(student a[],int p,int r,int cases)
{
   student x=a[r];//通常,拿最后一个值,作为预期的中间值
    int middle=p;//记录“较小的一段数据”的最大下标。通常这个值在p和r的中间,故起名middle
    for(int j=p; j<r; j++)
    {
        switch(cases){
           case 1:   //按id排序
            if(isBig1(a[j],x))
            {
                if(j!=middle)
                {
                student temp=a[middle];
                a[middle]=a[j];
                a[j]=temp;
                }
                  middle++;
               }

           break;
           case 2:
            if(isBig2(a[j],x))
            {
                if(j!=middle)
                {
                student temp=a[middle];
                a[middle]=a[j];
                a[j]=temp;
                }
                  middle++;
               }
           break;
           case 3:
            if(isBig3(a[j],x))
            {
                if(j!=middle)
                {
                student temp=a[middle];
                a[middle]=a[j];
                a[j]=temp;
                }
                  middle++;
               }
           break;


        }

    }
    student temp=a[r];
    a[r]=a[middle];
    a[middle]=temp;
    return middle;
}


void QuickSort(student a[],int p,int r,int c)
{
    if(p<r)
    {
        int q=partition(a,p,r,c);
        QuickSort(a,p,q-1,c);
        QuickSort(a,q+1,r,c);
    }
}
int  main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
   int n,c,i;
   int p=0;
   while(cin>>n>>c&&(n||c)){
       p++;
       for(i=0;i<n;i++){
          cin>>stu[i].id>>stu[i].name>>stu[i].score;
       }


       cout<<"Case "<<p<<":\n";
       QuickSort(stu,0,n-1,c);
       for(i=0;i<n;i++)
       stu[i].show();





   }


    #ifndef  ONLINE_JUDGE
    fclose(stdin);
    #endif

    return 0;

}



 

posted @ 2014-03-26 22:12  dengyaolong  阅读(134)  评论(0编辑  收藏  举报