题干
输入样例
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
输出样例
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
想法
初次看到这一题时,感觉信息量很大,排序方式很复杂(本人菜鸡)。但也是有些想法的,首先,可以创建一个学生类,来存储这些信息。然后利用vector自定义四个动态数组,对应四个等级的学生,方便排序。最后就是排序了,很自然想到algorithm头文件中的sort排序算法,但是我们在使用之前需要定义一下排序办法,也就是sort函数中的第三个参数。以上便是求解这个问题的核心想法。具体细节和发现的有意思的东西在代码中。
CODE
#include<bits/stdc++.h>
using namespace std;
class stu
{
public:
stu(string m_number,int m_de,int m_cai)
{
this->number=m_number;
this->de=m_de;
this->cai=m_cai;
}
bool operator()( stu &studata1, stu &studata2)
{
int sum1=studata1.de+studata1.cai,sum2=studata2.de+studata2.cai;
if(sum1>sum2)
{
return true;
}
if(sum1<sum2)
{
return false;
}
if(sum1==sum2)
{
if(studata1.de>studata2.de)
{
return true;
}
if(studata1.de<studata2.de)
{
return false;
}
if(studata1.de==studata2.de)
{
if(studata1.number<studata2.number)
{
return true;
}
else
{
return false;
}
}
}
}
string number;
int de;
int cai;
};
bool cmp(stu &studata1,stu &studata2)
{
int sum1=studata1.de+studata1.cai,sum2=studata2.de+studata2.cai;
if(sum1>sum2)
{
return true;
}
if(sum1<sum2)
{
return false;
}
if(sum1==sum2)
{
if(studata1.de>studata2.de)
{
return true;
}
if(studata1.de<studata2.de)
{
return false;
}
if(studata1.de==studata2.de)
{
if(studata1.number<studata2.number)
{
return true;
}
else
{
return false;
}
}
}
}
int main()
{
int n,jige,youxiu;
cin>>n>>jige>>youxiu;
vector<stu>stu_data1,stu_data2,stu_data3,stu_data4;
// stu stu_data1[10000];
// stu stu_data2[10000];
// stu stu_data3[10000];
// stu stu_data4[10000];
int num=0;
int t1=0,t2=0,t3=0,t4=0;
for(int i=0;i<n;i++)
{
int de,cai;
string number;
cin>>number>>de>>cai;
stu temp(number,de,cai);
if(de>=jige&&cai>=jige)
{
num++;
if(de>=youxiu&&cai>=youxiu)
{
// stu_data1[t1].de=de;
// stu_data1[t1].cai=cai;
stu_data1.push_back(temp);
// stu_data1[t1].number=number;
t1++;
continue;
}
if(de>=youxiu&&cai>=jige)
{
// stu_data2[t2].de=de;
// stu_data2[t2].cai=cai;
// stu_data2[t2].number=number;
stu_data2.push_back(temp);
t2++;
continue;
}
if(de>=jige&&cai>=jige&&de>=cai)
{
// stu_data3[t3].de=de;
// stu_data3[t3].cai=cai;
// stu_data3[t3].number=number;
stu_data3.push_back(temp);
t3++;
continue;
}
// stu_data4[t4].de=de;
// stu_data4[t4].cai=cai;
// stu_data4[t4].number=number;
stu_data4.push_back(temp);
t4++;
}
}
cout<<num<<endl;
if(t1!=0)
{
sort(stu_data1.begin(),stu_data1.end(),cmp);
for(int i=0;i<t1;i++)
{
cout<<stu_data1[i].number<<" "<<stu_data1[i].de<<" "<<stu_data1[i].cai<<endl;;
}
}
if(t2!=0)
{
sort(stu_data2.begin(),stu_data2.end(),cmp);
for(int i=0;i<t2;i++)
{
cout<<stu_data2[i].number<<" "<<stu_data2[i].de<<" "<<stu_data2[i].cai<<endl;;
}
}
if(t3!=0)
{
sort(stu_data3.begin(),stu_data3.end(),cmp);
for(int i=0;i<t3;i++)
{
cout<<stu_data3[i].number<<" "<<stu_data3[i].de<<" "<<stu_data3[i].cai<<endl;;
}
}
if(t4!=0)
{
sort(stu_data4.begin(),stu_data4.end(),cmp);
for(int i=0;i<t4;i++)
{
cout<<stu_data4[i].number<<" "<<stu_data4[i].de<<" "<<stu_data4[i].cai<<endl;;
}
}
return 0;
}
小插曲
我最开始并没有想到使用动态数组,而是事先规定好大小,然而提交了几次总是会出现段错误,当我把四个数组大小改到10w的时候,发现全部测试点都段错误。试着试着改到5w的时候刚刚好,这说明测试的数据并没有变态到某个等级有十万个,也是侥幸AC。