马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不爱听课的同学 于 2020-11-18 16:07 编辑
自己找了快速输入的代码,但算法过程太慢超时了,看了一下答案不懂为什么答案比较快
自己的超时代码#include <iostream>
using namespace std;
inline void scan_d(int* num) //快速输入函数代码
{
char in;
in = getchar();
if (in == EOF) return;
while (in != '-' && (in < '0' || in>'9')) in = getchar();
if (in == '-') { *num = 0; }
else *num = in - '0';
while (in = getchar(), in >= '0' && in <= '9') {
*num *= 10, * num += in - '0';
}
return;
}
int main()
{
int N, score, A=0,B=0,C=0,D=0,E=0;
scan_d(&N);
for (int i = 1;i <= N;i++) { //成绩处理部分
scan_d(&score);
if (score >= 90) A++;
else if (score >= 80) B++;
else if (score >= 70) C++;
else if (score >= 60) D++;
else E++;
}
printf("%d %d %d %d %d", A, B, C, D, E);
return 0;
}
答案代码int a[120]; //创建包含每个成绩的数组
int main()
{
int A = 0, B = 0, C = 0, D = 0, E = 0;
int N = 0, score, i = 0;
scan_d(&N);
for (i = 1; i <= N; i++)
{
scan_d(&score);
a[score]++;
}
i = 0; //成绩录入
for (; i < 60; i++)
E += a[i];
for (; i < 70; i++)
D += a[i];
for (; i < 80; i++)
C += a[i];
for (; i < 90; i++)
B += a[i];
for (; i <= 100; i++)
A += a[i];
printf("%d %d %d %d %d", A, B, C, D, E);
return 0;
}
为什么答案的方法更快,而我的方法超时了,答案是用了某种算法吗?还有没有其他解法?
本帖最后由 sunrise085 于 2020-11-18 15:33 编辑
不知道你是否理解答案的执行过程,这是一分一档汇总人数,然后再按照划分层次再次汇总。
a[score]就是分数为score的人数,后面按照数组a的下标进行汇总即可。
你的写法在N特别大的时候就会显得很慢。
因为你的程序运算次数多,每输入一个分数,需要执行1~4次比较运算,然后再执行一次加法运算,总运算次数是2N~4N,此外,分支也会很消耗时间,是的程序更慢
答案,每输入一个分数执行一次加法,输入结束后,执行100加法进行人数汇总,总的计算次数是N+100
|