PAT A1011
太简单了,只贴代码做记录。
#include <iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
string a="WTL";
float p[3][3]={0};
int i,key,j;
float m=0,ans=1;
//int k[3]={0};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
cin>>p[i][j];
if(p[i][j]>m)
{
m=p[i][j];
key=j;
}
}
cout<<a[key]<<" ";
ans*=m;
m=0;
}
ans=((ans*0.65)-1)*2;
cout<<fixed<<setprecision(2)<<ans;
return 0;
}
PAT A1012
唉,又是一道简单费劲的题……
这题我觉得正是我需要的,练习一下结构体的使用……
然后出了结构体,这个还有排序问题,查找问题巴拉巴拉,所以觉得在上面花时间很值得。
虽然答案只有21/25,我知道自己的错哪了……就是成绩相同时候的排序……
#include<iostream>
#include<math.h>
#include<string>
#include<vector>
#include<iomanip>
#include<algorithm>
using namespace std;
struct Mark
{
int c, ma, e, a,rank;//C语言 数学 英语 平均 序号
string id;//学号
int flag;//01234分别代表查无此人、ACME
int best;//记录最好排名
};
Mark stu[2005];
bool cmpc(Mark a, Mark b)//比较C语言成绩
{
if (a.c>b.c)
return 1;
else
return 0;
}
bool cmpma(Mark a, Mark b)//比较数学成绩
{
if (a.ma>b.ma)
return 1;
else
return 0;
}
bool cmpe(Mark a, Mark b)//比较英语成绩
{
if (a.e>b.e)
return 1;
else
return 0;
}
bool cmpa(Mark a, Mark b)//比较平均成绩
{
if (a.a>b.a)
return 1;
else
return 0;
}
bool cmpr(Mark a, Mark b)//序号排序
{
if (a.rank > b.rank)
return 0;
else
return 1;
}
int main()
{
int n, m, i,j;
cin >> n >> m;
string aa = "ACME",ss;
vector<string>name;
vector<string>::iterator it;
vector<string>who;
for (i = 0; i<n; i++)//信息录入
{
cin >> stu[i].id >> stu[i].c >> stu[i].ma >> stu[i].e;
//stu[i].flag=1;
stu[i].a = (stu[i].c + stu[i].ma + stu[i].e) / 3;
name.push_back(stu[i].id);
stu[i].rank = i;
}
it = name.begin();
//按优先级排序
sort(stu, stu + n, cmpa);//平均成绩排序
for (i = 0; i<n; i++)
{
stu[i].flag = 1;//初始化
stu[i].best = i;
//cout << "平均成绩排名:" << endl;
//cout << i << " " << stu[i].id << " "<<stu[i].a<<endl;
}
sort(stu, stu + n, cmpc);//C语言
for (i = 0; i<n; i++)
{
//cout << "C语言成绩排名:" << endl;
//cout << i << " " << stu[i].id << " " << stu[i].c << endl;
if (stu[i].best>i)
{
stu[i].best = i;
stu[i].flag = 2;//最好成绩为C语言
}
}
sort(stu, stu + n, cmpma);//数学成绩
for (i = 0; i<n; i++)
{ //cout << "数学语言成绩排名:" << endl;
//cout << i << " " << stu[i].id << " " << stu[i].ma << endl;
if (stu[i].best>i)
{
stu[i].best = i;
stu[i].flag = 3;//最好成绩为数学
}
}
sort(stu, stu + n, cmpe);//英语成绩
for (i = 0; i<n; i++)
{
if (stu[i].best>i)
{
stu[i].best = i;
stu[i].flag = 4;//最好成绩为英语
}
}
sort(stu, stu + n, cmpr);
for (i = 0; i < m; i++)
{
cin >> ss;
who.push_back(ss);
}
for (i = 0; i < m;i++)
{
it = find(name.begin(), name.end(), who[i]);//查找
if (it == name.end())
{
cout << "N/A";//查无此人
}
else
{
j= distance(name.begin(), it);
//cout << "j=" << j << endl;
cout << (stu[j].best)+1 << " " << aa[(stu[j].flag) - 1];
}
if (i != m - 1)//换行
cout << endl;
}
system("PAUSE");
return 0;
}
所以,我太累了,我去看看别人的答案~
https://blog.csdn.net/dancheng1/article/details/53646144
这位大大写的比较简单(这就是差距……)
然后我看了一下,我发现了自己的错误,但是我懒得改哈哈哈哈哈哈哈……我好累
bool cmp_C(student a, student b)
{
return (a.C > b.C);
}
首先是它的这比较函数,就比写的简洁很多……
这时候仅仅进行了排序,而没有排名。
if(Rank[_find][0] == 0){
cout<<"N/A"<<endl;
这句绝了……
我还在傻傻用find的时候,人家建立了一个巨大的数组,学号就是角标,内容是排名,开始都初始化为0,后面存入排名,所以如果这个角标下排名是0,说明这个不存在……
卧槽……
我好蠢……
嗯……今天依旧学到了好多~开熏!!
啊 还有一点,就是有并列排名的时候,最好新建数组储存排名,不要像我这次一样傻傻的,用序号做排名……呵呵……