开始看着这题很简单,结果超时问题一直解决不了。
下面是我开始写的代码的得分和源代码
运行结果
运行超时的程序源代码
#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;
}