解题代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct student {
int id, virtue, talent, revel;
} s[ 100000 ] ;
typedef struct student stu;
bool cmp ( stu a, stu b) {
if ( a. revel != b. revel) return a. revel < b. revel;
if ( a. virtue + a. talent != b. virtue + b. talent) return a. virtue + a. talent > b. virtue + b. talent;
if ( a. virtue != b. virtue) return a. virtue > b. virtue;
else return a. id < b. id;
}
int main ( )
{
int num, L, H, cnt = 0 ;
scanf ( "%d %d %d" , & num, & L, & H) ;
for ( int i = 0 ; i < num; i++ ) {
scanf ( "%d %d %d" , & s[ i] . id, & s[ i] . virtue, & s[ i] . talent) ;
if ( s[ i] . virtue < L || s[ i] . talent < L) s[ i] . revel = 5 ;
else if ( s[ i] . virtue >= H && s[ i] . talent >= H) s[ i] . revel = 1 ;
else if ( s[ i] . virtue >= H && s[ i] . talent < H) s[ i] . revel = 2 ;
else if ( s[ i] . virtue >= s[ i] . talent) s[ i] . revel = 3 ;
else s[ i] . revel = 4 ;
if ( s[ i] . revel <= 4 ) cnt++ ;
}
sort ( s, s + num, cmp) ;
printf ( "%d" , cnt) ;
for ( int i = 0 ; i < cnt; i++ )
printf ( "\n%d %d %d" , s[ i] . id, s[ i] . virtue, s[ i] . talent) ;
return 0 ;
}
测试结果
问题整理
1.排序算法。
2.cmp的判断中用连续多个if(***!=***)的格式直接负数题目的条件,更为直观。
3.else if 的连续判断中,后续的判断条件天然不包括之前的判断条件,因此可以在不乱的条件下,简化判断条件。