PTA乙级题 1015. 德才论 (25)

【题目链接】


先上大佬写的代码。

#include<cstdio> 
#include<string.h> 
#include<vector> 
#include<algorithm> 

using namespace std;  

struct student{  
  int num;  
  int s;     //sum 
  int score1;//morality 
  int score2;//ability 
};  

bool rule(const student &s1, const student &s2)  
{  
  if (s1.s < s2.s){  
    return false;  
  }  
  else if (s1.s>s2.s){  
    return true;  
  }  
  else{  
    if (s1.score1 < s2.score1){  
      return false;  
    }  
    else if (s1.score1>s2.score1){  
      return true;  
    }  
    else{  
      if (s1.num < s2.num){  
        return true;  
      }  
      else{  
        return false;  
      }  
    }  
  }  
}  

int main(){  
  vector<student> vec1; //student of type1 
  vector<student> vec2; //student of type2 
  vector<student> vec3; //student of type3 
  vector<student> vec4; //student of type4 
  student t;  
  int n, l, h;  

  //input 
  scanf("%d %d %d", &n, &l, &h);  
  for (int i = 0; i < n; i++){  
    scanf("%d %d %d", &t.num, &t.score1, &t.score2);  
    if (t.score1 >= l&&t.score2 >= l){    
      if (t.score1 >= h&&t.score2 >= h){  
        t.s = t.score1 + t.score2;  
        vec1.push_back(t);  
      }  
      else if (t.score1 >= h){  

        t.s = t.score1 + t.score2;  
        vec2.push_back(t);  
      }  
      else if (t.score1 >= t.score2){  
        t.s = t.score1 + t.score2;  
        vec3.push_back(t);  
      }  
      else{  
        t.s = t.score1 + t.score2;  
        vec4.push_back(t);  
      }  
    }  
  }  

  //sort 
  sort(vec1.begin(), vec1.end(), rule);  
  sort(vec2.begin(), vec2.end(), rule);  
  sort(vec3.begin(), vec3.end(), rule);  
  sort(vec4.begin(), vec4.end(), rule);  
  // 

  //output 
  printf("%d\n", vec1.size() + vec2.size() + vec3.size() + vec4.size());  
  for (int i = 0; i<vec1.size(); i++){  
    printf("%d %d %d\n", vec1[i].num, vec1[i].score1, vec1[i].score2);  
  }  
  for (int i = 0; i<vec2.size(); i++){  
    printf("%d %d %d\n", vec2[i].num, vec2[i].score1, vec2[i].score2);  
  }  
  for (int i = 0; i<vec3.size(); i++){  
    printf("%d %d %d\n", vec3[i].num, vec3[i].score1, vec3[i].score2);  
  }  
  for (int i = 0; i<vec4.size(); i++){  
    printf("%d %d %d\n", vec4[i].num, vec4[i].score1, vec4[i].score2);  
  }  
  // 

  scanf("%d %d %d", &n, &l, &h);  
  return 0;  
} 

下面是自己写的代码,有几个点运行超时,很无奈。

#include<stdio.h>
typedef struct node
{
    int id;
    int de;
    int cai;
}Node;
int main()
{
    int i,j,n,min,max,count=0,x[4]={0};
    scanf("%d %d %d",&n,&min,&max);
    Node a[n],b[4][n]={0},temp;
    for (i=0;i<n;i++)
    {
        scanf("%d %d %d",&a[i].id,&a[i].de,&a[i].cai);
        if (a[i].de>=min&&a[i].cai>=min)
        count++;
    }
    printf("%d\n",count);
    //第一类
    for (i=0;i<n;i++)
    {
        if (a[i].de>=max&&a[i].cai>=max)
        b[0][x[0]++]=a[i];
    }
    //第二类
    for (i=0;i<n;i++)
    {
        if (a[i].de>=max&&a[i].cai>=min&&a[i].cai<max)
        b[1][x[1]++]=a[i];
    }
    //第三类
    for (i=0;i<n;i++)
    {
        if (a[i].de>=min&&a[i].de<max&&a[i].cai>=min&&a[i].cai<max&&a[i].de>=a[i].cai)
        b[2][x[2]++]=a[i];
    }
    //第四类
    for (i=0;i<n;i++)
    {
        if (a[i].de>=min&&a[i].de<max&&a[i].cai>=min&&a[i].de<a[i].cai)
        b[3][x[3]++]=a[i];
    }
    //输出 
    for (int k=0;k<4;k++)
    {
        for (i=0;i<x[k]-1;i++)
        {
            for (j=0;j<x[k]-1-i;j++)
            {
                if (b[k][j].de+b[k][j].cai<b[k][j+1].de+b[k][j+1].cai||(b[k][j].de+b[k][j].cai==b[k][j+1].de+b[k][j+1].cai&&b[k][j].de<b[k][j+1].de)||(b[k][j].de+b[k][j].cai==b[k][j+1].de+b[k][j+1].cai&&b[k][j].de==b[k][j+1].de&&b[k][j].id>b[k][j+1].id))
                {
                    temp=b[k][j];
                    b[k][j]=b[k][j+1];
                    b[k][j+1]=temp;
                }
            }
        }
        for (i=0;i<x[k];i++)
        printf("%d %d %d\n",b[k][i].id,b[k][i].de,b[k][i].cai);
    }
}