小白成长记之PTA乙级题 1015

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值