信息奥赛一本通1115:直方图 90分算法超时求助

独有情殇 2020-12-09 06:47:41
1115:直方图

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 21217 通过数: 13727
【题目描述】
给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。

假设 Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。

【输入】
第一行n是数组的大小。1≤n≤10000。

紧接着一行是数组的n个元素。

【输出】
按顺序输出每个数的出现次数,一行一个数。如果没有出现过,则输出0。

对于例子中的数组,最大的数是3,因此我们只统计{0,1,2,3}的出现频数。

【输入样例】
5
1 1 2 3 1
【输出样例】
0
3
1
1
我的代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[10001],max1=0,b,num;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(a[i]>max1)
{
max1=a[i];
b=i;
}

}
for(int j=0;j<=max1;j++)
{
num=0;
for(int i=1;i<=n;i++)
{
if(a[i]==j) num++;
}
cout<<num<<endl;
}
return 0;
}

运行结果:
【1115】程序运行结果

用户名:15997682622,题目编号:1115,运行编号:9148291,代码长度:369Bytes

通过

测试点 结果 内存 时间
测试点1 答案正确 456KB 6MS
测试点2 答案正确 448KB 10MS
测试点3 答案正确 448KB 8MS
测试点4 答案正确 472KB 80MS
测试点5 答案正确 464KB 237MS
测试点6 答案正确 460KB 341MS
测试点7 答案正确 480KB 698MS
测试点8 答案正确 500KB 558MS
测试点9 答案正确 504KB 749MS
测试点10 答案正确 508KB 759MS

------------------------------------------------------------------------
洛谷上超时,一本通通过,请大佬看看能不能进一步优化,谢谢啦
...全文
2558 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
独有情殇 2020-12-10
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
我的想法,a[] 数组先清零(看可使用函数优先使用 memset()否则就得循环了)然后用来存放各数的计数,输入数据时判断非负后 a[x]++ ;输入完后再一个循环结果的输出。最多 3个单循环吧,你这个代码却有了两重循环了,一旦数据量大了,耗时会剧增。
谢谢大佬
zara 2020-12-09
  • 打赏
  • 举报
回复
我的想法,a[] 数组先清零(看可使用函数优先使用 memset()否则就得循环了)然后用来存放各数的计数,输入数据时判断非负后 a[x]++ ;输入完后再一个循环结果的输出。最多 3个单循环吧,你这个代码却有了两重循环了,一旦数据量大了,耗时会剧增。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧