这两个题是一模一样的

我自己洗的代码比较惨不忍赌。但是也通过了一半多。我是想着输入的同时排好序。

#include <cstdio>

struct Student {
int ID;
int De;
int Cai;
int Total;
} Class1[], Class2[], Class3[], Class4[]; void Insert(Student Class[], int ID, int De, int Cai, int num) {//将新输入的信息插入
int i,total = De + Cai;
if (num == ) {
Class[].ID = ID;
Class[].De = De;
Class[].Cai = Cai;
Class[].Total = total;
}
else {
for (i = num - ;i >= ;i--) {//寻找插入的位置
if (Class[i].Total<total || (Class[i].Total == total && Class[i].De<De)|| (Class[i].Total == total && Class[i].De==De&& Class[i].ID>ID)) {
Class[i + ].ID = Class[i].ID;
Class[i + ].De = Class[i].De;
Class[i + ].Cai = Class[i].Cai;
Class[i + ].Total = Class[i].Total;
}
else {
break;
}
}
Class[i + ].ID = ID;//在找到的插入位置里插入信息
Class[i + ].De = De;
Class[i + ].Cai = Cai;
Class[i + ].Total = total;
}
}
int main()
{
int N, L, H, temp_ID, temp_De, temp_Cai, All_num = , Class1_num = , Class2_num = , Class3_num = , Class4_num = ;
scanf("%d%d%d", &N, &L, &H);
while (N--) {
scanf("%d%d%d", &temp_ID, &temp_De, &temp_Cai);
if (temp_De >= H && temp_Cai >= H)//判断是属于哪一类
{
Class1_num++;
Insert(Class1, temp_ID, temp_De, temp_Cai, Class1_num);
}
else if (temp_De >= H && temp_Cai<H&&temp_Cai>=L)
{
Class2_num++;
Insert(Class2, temp_ID, temp_De, temp_Cai, Class2_num);
}
else if (temp_De<H&&temp_Cai<H&&temp_De >= temp_Cai&&temp_De>L&&temp_Cai>=L)
{
Class3_num++;
Insert(Class3, temp_ID, temp_De, temp_Cai, Class3_num);
}
else if (temp_De>=L&&temp_Cai>=L)
{
Class4_num++;
Insert(Class4, temp_ID, temp_De, temp_Cai, Class4_num);
}
else continue;
}
All_num = Class1_num + Class2_num + Class3_num + Class4_num;
printf("%d\n", All_num);
for (int i = ;i<Class1_num;i++) printf("%d %d %d\n", Class1[i].ID, Class1[i].De, Class1[i].Cai);
for (int i = ;i<Class2_num;i++) printf("%d %d %d\n", Class2[i].ID, Class2[i].De, Class2[i].Cai);
for (int i = ;i<Class3_num;i++) printf("%d %d %d\n", Class3[i].ID, Class3[i].De, Class3[i].Cai);
for (int i = ;i<Class4_num;i++) printf("%d %d %d\n", Class4[i].ID, Class4[i].De, Class4[i].Cai);
return ;
}

我的没有完全通过,并且我暂时找不到错误,就看了看教材上的。

在教材上的代码就比较简洁了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student
{
char id[];
int de, cai, sum;
int flag;//在第几类
}stu[];
bool cmp(Student a, Student b) {
if (a.flag != b.flag) return a.flag < b.flag;
else if (a.sum != b.sum) return a.sum > b.sum;
else if (a.de != b.de) return a.de > b.de;
else return strcmp(a.id, b.id) < ;
}
int main() {
int n, L, H;
scanf("%d%d%d", &n, &L, &H);
int m = n;//及格的人数
for (int i = ;i < n;i++) {
scanf("%s%d%d", stu[i].id, &stu[i].de, &stu[i].cai);
stu[i].sum = stu[i].de + stu[i].cai;
if (stu[i].de < L || stu[i].cai < L) {
stu[i].flag = ;
m--;
}
else if (stu[i].de >= H&&stu[i].cai >= H) stu[i].flag = ;
else if (stu[i].de >= H && stu[i].cai < H) stu[i].flag = ;
else if (stu[i].de >= stu[i].cai) stu[i].flag = ;
else stu[i].flag = ; }
sort(stu, stu + n, cmp);
printf("%d\n", m);
for (int i = ;i < m;i++) {
printf("%s %d %d\n", stu[i].id, stu[i].de, stu[i].cai);
}
return ;
}

注意点:1,分类,2、排序函数

05-11 20:19