PTA乙级题 1015. 德才论 (25)
【题目链接】
先上大佬写的代码。
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
struct student{
int num;
int s;
int score1;
int score2;
};
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;
vector<student> vec2;
vector<student> vec3;
vector<student> vec4;
student t;
int n, l, h;
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(vec1.begin(), vec1.end(), rule);
sort(vec2.begin(), vec2.end(), rule);
sort(vec3.begin(), vec3.end(), rule);
sort(vec4.begin(), vec4.end(), rule);
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);
}
}