1015 德才论 运行超时问题

开始看着这题很简单,结果超时问题一直解决不了。
下面是我开始写的代码的得分和源代码

运行结果

在这里插入图片描述

运行超时的程序源代码

#include<iostream>
using namespace std;
class student{
	public:
		int id;
		int de;
		int cai;
		int sum;
		int flag;//1表示德才兼备,2表示 德胜才,3 表示"才德兼亡"且"德胜才",4 表示"才胜德 " ,5表示没通过 
		student(const student & c){
        	id = c.id; de = c.de; cai=c.cai; sum=c.sum; flag=c.flag;
    	} 
    	student(){	}
};
int main(){
	int N,L,H;
	int i,j;
	int count=0;//表示被录取的人数 
	cin>>N>>L>>H;
	student s[N];
	for(i=0;i<N;i++)
	{
		cin>>s[i].id>>s[i].de>>s[i].cai;
		s[i].sum=s[i].de+s[i].cai;
		if(s[i].de>=L&&s[i].cai>=L)
		{
			count++;
			if(s[i].de>=H&&s[i].cai>=H)  s[i].flag=1;
			else if(s[i].de>=H&&s[i].cai<H)  s[i].flag=2;
			else if(s[i].de<H&&s[i].cai<H&&s[i].de>s[i].cai)  s[i].flag=3;
			else s[i].flag=4;
		}
		else s[i].flag=5;
	} 
	student c;
	for(i=0;i<N;i++) 
	{
		for(j=0;j<N-i-1;j++)
		{
			if(s[j].flag>s[j+1].flag)
			{
				c=s[j];
				s[j]=s[j+1];
				s[j+1]=c;
				continue;
			}
			else if(s[j].flag==s[j+1].flag)
			{
				if(s[j].sum<s[j+1].sum)
				{
					c=s[j];
					s[j]=s[j+1];
					s[j+1]=c;
				}
				else if(s[j].sum==s[j+1].sum)
				{
					if(s[j].de<s[j+1].de)//考虑  如果flag一样,总分一样,德分数高的在前 
					{
						c=s[j];
						s[j]=s[j+1];
						s[j+1]=c;
					}
					else if(s[j].de==s[j+1].de)//考虑,flag一样,总跟一样,德分一样,学号小的在前 
					{
						if(s[j].id>s[j+1].id)
						{
							c=s[j];
							s[j]=s[j+1];
							s[j+1]=c;
						}
					}
				}
			}
		}
	}
	cout<<count<<endl;
	for(i=0;i<count;i++)
	{
		cout<<s[i].id<<' '<<s[i].de<<' '<<s[i].cai;
		if(i!=count-1) cout<<endl;
	}
}

问题

看了好几遍自己的代码,就是找不到自己哪里错了,肯定没有死循环的可能,也没有编译错误,那么问题出在哪呢。问题肯定是处在了时间上面。
看了看别人的博客 ,解决问题的关键:
1.把 cin和cout换成scanf 和printf,cin和cout的速度比较慢,
2.用 sort函数排序,(我自己用的冒泡法)

开始我吧cin ,cout都换了,之后还是运行超时, 然后我的代码如果改成用sort函数改了一下,这里我又重新复习了一下标准模板库的知识,注意sort函数的第三个参数很重要。在这道题里我写了一个cmp函数

改好的程序源代码

using namespace std;
#include <algorithm>
#include <vector>
#include <stdio.h>
 
class student
{
	public:
		int id;
		int de;
		int cai;
		int sum;
		int flag;//学生的种类 
};
bool cmp(student a, student b)	//用于sort的第三个参数 
{
	if (a.flag!=b.flag) return (a.flag<b.flag);
	else if (a.sum!=b.sum) return (a.sum>b.sum);
	else if (a.de!=b.de) return (a.de>b.de);//flag 一样,总分一样,德分高的在前 
		else return(a.id<b.id);//编号的顺序在flag,总分和德分相同的情况下 ,编号小的在前 
}
int main()
{
	int N, L, H;
	scanf("%d %d %d",&N,&L,&H);
	vector <student> v;
	student s[N];
	for (int i=0;i<N;i++)
	{	
		scanf("%d %d %d",&s[i].id,&s[i].de,&s[i].cai);
		s[i].sum=s[i].de+s[i].cai;
		if(s[i].de >= L && s[i].cai >= L)
		{
			if(s[i].de>=H&&s[i].cai>= H)						s[i].flag = 1;		
			else if(s[i].de>=H&&s[i].cai<H)						s[i].flag = 2;			
			else if(s[i].cai<H&&s[i].de<H&&s[i].de>=s[i].cai)	s[i].flag = 3;		
			else 												s[i].flag = 4;			
			v.push_back(s[i]);		
		}	
	}
	printf("%d\n",v.size());
	sort(v.begin(),v.end(),cmp);
	for (int i=0;i<v.size();i++)
	{
		printf("%d %d %d\n",v[i].id, v[i].de, v[i].cai);
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值