问题标题: 酷町堂:3112 统计数字

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

3112   统计数字 经验值:400

不许抄袭,一旦发现,直接清空经验!

题目描述 Description

某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入描述 Input Description

输入包含n+1行;

第一行是整数n,表示自然数的个数;

第2~n+1每行一个自然数。

输出描述 Output Description

输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。

每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

样例输入 Sample Input

8 2 4 2 4 5 100 2 100

样例输出 Sample Output

2 3 4 2 5 1 100 2

数据范围及提示 Data Size & Hint

40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)

 

 

这道题写到一半发现桶数组没发开到1.5*10^9,循环次数也要1.5*10^9,会超时,有没有方法呢????

PS:最好附上核心和思路,orz

张恩泽在2020-10-30 19:19:44追加了内容

我也顶!


0
已采纳
邓犁
邓犁
高级守护
高级守护

3112  50分代码

#include<iostream>
using namespace std;
long long a[200010],minn=1500000001,cnt;
int main()
{
    int n,res;
    cin>>n;
    res=n;
    for(int i=1;i<=n;i++)
    {
     cin>>a[i];
 }
 while(1)
 {
  minn=1500000001;
  for(int i=1;i<=n;i++)
  {
   if(a[i]<minn&&a[i]!=-1)
   {
    minn=a[i];
   }
  }
  cnt=0;
  for(int i=1;i<=n;i++)
  {
   if(a[i]==minn)
   {
    cnt++;
    a[i]=-1;
    res--;
   }
  }
  cout<<minn<<' '<<cnt<<endl;
  if(res==0)
  {
   break;
  }
 }
 
    return 0;
}

我尽力了

我要回答