天天快乐编程集训队2021暑假训练-0805-结构体题解

结构体也是比较常考察的内容,大家务必学会。

1.7018 输出最高分数的学生姓名

第一题不用结构体排序就可以了,用了反而要担心最大的是不是编号小的。
第一个在不在前面,与排序的稳定性有关。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	while(cin>>n)
	{
        //设置一个到不了的值
		int M=-1;
		string ans;
		for(int i=1;i<=n;i++)
		{
            int x;
            string t;
			cin>>x>>t;
			if(x>M)
			{
				M=x;
				ans=t;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

2.6961 奥运奖牌榜

这就是一道中规中矩的结构体排序了,需要我们写出cmp函数

#include <bits/stdc++.h>
using namespace std;
struct Country
{
    int id;
    string name;
    int person,gold,silver,bronze,total;
    int input_id;
}a[105];
int cmp(Country a,Country b)
{
    if(a.total==b.total)return a.name<b.name;
    return a.total<b.total;
}
int main()
{
	int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].id>>a[i].name>>a[i].person>>a[i].gold>>a[i].silver>>a[i].bronze>>a[i].total;
        a[i].input_id=i;
    }
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++)
    {
        cout<<a[i].name<<" "<<a[i].total<<"\n";
    }
	return 0;
}

3.5617 看电视

本题是大学生期末考试题,有一些小坑。正式比赛仅有一次机会,请养成好习惯,将问题思考清楚,一遍AC。
我们需要把时间转换为是今天的第几秒,因为没有前导0,不能直接按字典序。

#include<bits/stdc++.h>
using namespace std;
struct line
{
	int pd;
	int h,m;
	string name;
}a[6];
bool cmp(line x,line y)
{
	if(x.pd!=y.pd)  return x.pd<y.pd;
	if(x.h!=y.h)  return x.h<y.h;
	return x.m<=y.m;
}
int main()
{	
	int n;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			char k;
			cin>>a[i].pd>>a[i].h>>k>>a[i].m>>a[i].name;
		}
		sort(a,a+n,cmp);
		string s;
		cin>>s;
		int flag=0;
		for(int i=0;i<n;i++)
		{
			if(a[i].name==s)
			{
				cout<<a[i].pd<<" "<<a[i].h<<":";
				printf("%02d\n",a[i].m);
				flag=1;
			}
		}
		if(flag==0)cout<<"no data\n";
	}
	return 0;
}

4.5022 德才论

1.可以设置个标记,比如才德全尽设为1,然后德胜才设为2,依次类推
2.也可以开几个数组分别排序

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5; 
struct T
{
	int id,de,cai;
	int flag;
}t,a[N]; 
int cmp(T a,T b)
{
	if(a.flag!=b.flag)
	return a.flag<b.flag;
	if(a.de+a.cai!=b.de+b.cai)
	return a.de+a.cai>b.de+b.cai;
	if(a.de!=b.de)return a.de>b.de;
	return a.id<b.id;
}
int main()
{
	int n,l,h;
	cin>>n>>l>>h;
	int tot=0;
	for(int i=0;i<n;i++)
	{
		cin>>t.id>>t.de>>t.cai;
		if(t.de<l||t.cai<l)continue;
		if(t.de>=h&&t.cai>=h)t.flag=1;
		else if(t.de>=h)t.flag=2;
		else if(t.de<h&&t.cai<h&&t.de>=t.cai)t.flag=3;
		else t.flag=4;
		a[tot++]=t;
	}
	sort(a,a+tot,cmp);
	cout<<tot<<"\n";
	for(int i=0;i<tot;i++)
	{
		cout<<a[i].id<<" "<<a[i].de<<" "<<a[i].cai<<"\n";
	}
	return 0; 
}

5.6158 奖学金评比

条件相对较少,实际上可能比前两题还简单

#include <bits/stdc++.h>
using namespace std;
struct T
{
	int n,d,z,nen,t,num;
	string name;
}a[301];
int cmp(T a,T b)
{
	if(a.num!=b.num) return a.num>b.num;
	if(a.d!=b.d) return a.d>b.d;
	if(a.z!=b.z) return a.z>b.z;
	if(a.nen!=b.nen) return a.nen>b.nen;
	return a.n<b.n;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
	{
		cin>>a[i].n>>a[i].name>>a[i].d>>a[i].z>>a[i].nen>>a[i].t;
		a[i].num=0.2*a[i].d+0.2*a[i].nen+0.05*a[i].t+0.55*a[i].z;
	}
	sort(a,a+n,cmp);
	cout<<a[0].n<<" "<<a[0].name; 
    return 0;
}

6.4894 竞赛排名

条件较多,公式较为复杂,可以先算出再排序。

#include <bits/stdc++.h>
using namespace std;
struct stures
{
	int id;
	double yv, sumv;
} res[1005];
bool cmp(stures r1, stures r2)
{
	if (r1.yv != r2.yv)
		return r1.yv > r2.yv;
	else if (r1.sumv != r2.sumv)
		return r1.sumv > r2.sumv;
	else
		return r1.id < r2.id;
}
int main()
{
	int n, x[1005][10] = {};
	double y[1005][10] = {}, avg[10] = {};
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < 8; j++)
			cin >> x[i][j]; // 输入
	for (int i = 0; i < 8; i++)
	{ // 算均分
		for (int j = 0; j < n; j++)
			avg[i] += x[j][i];
		avg[i] /= n;
	}
	for (int i = 0; i < 8; i++)
		for (int j = 0; j < n; j++)
		{ // 算位置分
			for (int k = 0; k < n; k++)
				y[j][i] += abs(x[k][i] - avg[i]);
			if (y[j][i] != 0)
				y[j][i] = (x[j][i] - avg[i]) / (y[j][i] / n);
		}
	for (int i = 0; i < n; i++)
	{ // 算总位置分
		res[i].id = i;
		res[i].sumv = 0;
		for (int j = 0; j < 3; j++)
			res[i].yv += y[i][j];
		for (int j = 3; j < 8; j++)
			res[i].yv += 0.8 * y[i][j];
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < 8; j++) // 算总分
			res[i].sumv += x[i][j];
	sort(res, res + n, cmp);
	for (int i = 0; i < n; i++)
		cout << res[i].id + 1 << endl; // 输出
	return 0;
}
posted @ 2021-08-05 11:08  暴力都不会的蒟蒻  阅读(58)  评论(0编辑  收藏  举报