zoukankan      html  css  js  c++  java
  • 天天快乐编程集训队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<<"
    ";
        }
    	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
    ",a[i].m);
    				flag=1;
    			}
    		}
    		if(flag==0)cout<<"no data
    ";
    	}
    	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<<"
    ";
    	for(int i=0;i<tot;i++)
    	{
    		cout<<a[i].id<<" "<<a[i].de<<" "<<a[i].cai<<"
    ";
    	}
    	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;
    }
    
    大佬您太强了,还请多多指教哎
  • 相关阅读:
    js选中下拉框的默认选项
    ajax请求简写
    js正则表达式的验证示例
    ACCESS的System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误
    jqure 获取地址栏的参数
    jqure全选/取消
    后台获取ajax发送过来的值
    使用jQuery POST提交数据返回的JSON是字符串不能解析为JSON对象
    导出数据 超出的单元格样式的最大数量。您可以定义多达4000风格
    How to debug Custom Action DLL
  • 原文地址:https://www.cnblogs.com/BobHuang/p/15102410.html
Copyright © 2011-2022 走看看