对于#2#3测试点WA的解决方法
2024-05-12 00:03:39
发布于:上海
26阅读
0回复
0点赞
————————————————————————————————————————————————————————
看到这种情况没有?是不是在做题的时候第2第3测试点十分美丽地WA了?
以下是我对我的代码的更改思路:
先给大伙儿展示一下我的WA代码
#include<iostream>
#include<algorithm>
using namespace std;
struct score{
string id;
int mark;
};
bool cmp(score f1, score f2){
if(f1.mark==f2.mark)return f2.id>f1.id;
return f1.mark > f2.mark;
}
int main(){
int n,m;
cin>>n>>m;
int ans=m*1.5;
score arr[n];
for(int i=0;i<n;i++){
cin>>arr[i].id>>arr[i].mark;
}
int cnt=0;
sort(arr,arr+n,cmp);
for(int i=0;i<n;i++){
if(arr[i].mark>=arr[ans].mark){
cnt++;
//cout<<arr[i].id<<" "<<arr[i].mark<<endl;
}
}
cout<<arr[ans-1].mark<<" "<<cnt<<endl;
for(int i=0;i<n;i++){
if(arr[i].mark>=arr[ans-1].mark){
cout<<arr[i].id<<" "<<arr[i].mark<<endl;
}
}
return 0;
}
然后是AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct score{
string id;
int mark;
};
bool cmp(score f1, score f2){
if(f1.mark == f2.mark) return f1.id < f2.id;
return f1.mark > f2.mark;
}
int main(){
int n,m;
cin>>n>>m;
int ans=m*1.5;
score arr[n];
for(int i=0;i<n;i++){
cin>>arr[i].id>>arr[i].mark;
}
sort(arr,arr+n,cmp);
int cnt=0;
for(int i=0;i<n;i++){
if(arr[i].mark>=arr[ans-1].mark){
cnt++;
}
}
cout<<arr[ans-1].mark<<" "<<cnt<<endl;
for(int i=0;i<n;i++){
if(arr[i].mark>=arr[ans-1].mark){
cout<<arr[i].id<<" "<<arr[i].mark<<endl;
}
}
return 0;
}
——————————————————————————————————————————————————
具体分析这两段代码,我们可以发现:WA代码中的一些细微问题包括:
1、在排序比较函数 cmp 中的逻辑问题:在 if(f1.mark==f2.mark) 的条件下返回了 f2.id > f1.id,这可能导致排序时出现意外的结果。
2、在计算排名时,应该是比中位数分数高或等于的人数,而WA代码中只计算了比中位数分数高的人数。
——————————————————————————————————————————————————
看完我的思路,大家也应该对#2#3测试点的修改有了大概的头绪了吧!那么在这里希望大家看到我的讨论分析有所收获,早日AC!
这里空空如也
有帮助,赞一个