2019-10-11 触及到知识盲区竟然有点欢乐!

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,说明这个不存在……
卧槽……
我好蠢……
嗯……今天依旧学到了好多~开熏!!
啊 还有一点,就是有并列排名的时候,最好新建数组储存排名,不要像我这次一样傻傻的,用序号做排名……呵呵……

发布了42 篇原创文章 · 获赞 16 · 访问量 2879

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/102496322
今日推荐