洛谷-统计数字-NOIP2007提高组复赛
题目描述 Description
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入输出格式 Input/output
输入格式:
输入文件count.in包含n+1行;
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
输出格式:
输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入文件count.in包含n+1行;
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
输出格式:
输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入输出样例 Sample input/output
样例测试点#1
输入样例:
8
2
4
2
4
5
100
2
100
输出样例:
2 3
4 2
5 1
100 2
说明 description
40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*109)
NOIP 2007 提高第一题
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*109)
NOIP 2007 提高第一题
思路:首先要对输入的数据进行升序排序,然后从头开始找数字出现的个数,找过的记得标记(我这里标记为-100),然后计数器++即可
代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int fun(const void *a,const void *b)//升序排序 4 { 5 return *(int*)a-*(int*)b; 6 } 7 int main() 8 { 9 int n,i,lala,j; 10 int ans=0; 11 int a[200000]; 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 { 15 scanf("%d",&a[i]); 16 } 17 qsort(a,n,sizeof(int),fun); 18 for(i=0;i<n;i++) 19 { 20 if(a[i]!=-100) 21 { 22 lala=a[i]; 23 for(j=0;j<n;j++) 24 { 25 if(a[j]==lala) 26 { 27 ans++; 28 a[j]=-100; 29 } 30 } 31 printf("%d %d",lala,ans); 32 printf("\n"); 33 ans=0; 34 } 35 } 36 return 0; 37 }
我不怕千万人阻挡,只怕自己投降…