测试点3一直未通过,网上搜索显示有三种情况:
1.应该先把总分四舍五入之后再排序;
2.算总分时:在期中成绩大于期末成绩时,应该分别判断成绩未输入的情况;(mm是期中成绩,nn是期末成绩,sumx是总分)
if(mm[name]<=nn[name]){
sumx=(double)(nn[name]);
}else{
if(mm[name]==-1){
sumx=(double)(nn[name]*0.6);
}else if(nn[name]==-1){
sumx=(double)(mm[name]*0.4);
}else{
sumx=(double)(mm[name]*0.4+nn[name]*0.6);
}
}
3.如果 使用结构体存储的话,需要初始化结构体;
我的问题是在进行vector的sort排序,关于cmp重写时,cmp函数不严谨
//正确情况:
typedef pair<string,int> PAIR;
bool cmp(const PAIR& a,const PAIR& b){
if(a.second!=b.second){
return a.second>b.second;
}else{
return a.first<b.first;
}
}
//错误情况:
typedef pair<string,int> PAIR;
bool cmp(const PAIR& a,const PAIR& b){
return a.second>b.second;
}
整道题的完整代码:
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
typedef pair<string,int> PAIR;
bool cmp(const PAIR& a,const PAIR& b){
if(a.second!=b.second){
return a.second>b.second;
}else{
return a.first<b.first;
}
}
int main(){
int p,m,n,i;
cin>>p>>m>>n;
map<string,double> pp,mm,nn,mulu;
map<string,int> sum;
string name;
int x;
for(i=0;i<p;i++){
cin>>name;
cin>>x;
if(x>=200){
pp[name]=x;
mulu[name]=1;
}
}
for(i=0;i<m;i++){
cin>>name;
cin>>x;
if(mulu[name]==1){
mm[name]=x;
if(x==0){
mm[name]=-1;
}
}
}
for(i=0;i<n;i++){
cin>>name;
cin>>x;
if(mulu[name]==1){
nn[name]=x;
if(x==0){
nn[name]=-1;
}
// mulu[name]=1;
}
}
map<string,double>::iterator it1;
for(it1=mulu.begin();it1!=mulu.end();it1++){
name=it1->first;
double sumx;
if(mm[name]==0){
mm[name]=-1;
}else if(mm[name]==-1){
mm[name]=0;
}
if(nn[name]==0){
nn[name]=-1;
}else if(nn[name]==-1){
nn[name]=0;
}
if(mm[name]<=nn[name]){
sumx=(double)(nn[name]);
}else{
if(mm[name]==-1){
sumx=(double)(nn[name]*0.6);
}else if(nn[name]==-1){
sumx=(double)(mm[name]*0.4);
}else{
sumx=(double)(mm[name]*0.4+nn[name]*0.6);
}
}
int temp=(int)(sumx+0.5);
if(temp>=60&&pp[name]>=200){
mulu[name]=2;
sum[name]+=temp;
}
}
vector<PAIR> vec;
map<string,int>::iterator it2;
for(it2=sum.begin();it2!=sum.end();it2++){
name=it2->first;
if(mulu[name]==2){
vec.push_back(make_pair(name,it2->second));
}
}
sort(vec.begin(),vec.end(),cmp);
vector<PAIR>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
name=it->first;
x=it->second;
cout<<name<<" "<<pp[name]<<" "<<mm[name];
cout<<" "<<nn[name]<<" "<<x<<endl;
}
return 0;
}