统计数字

原题链接:https://www.luogu.org/problem/show?pid=1097

纪念开学第一天,随手A掉一道大水题纪念一下。

题意非常明显,让我们排序并且统计数字,但数据量较大。

一开始想到最暴力的桶排序,但发现桶排序开不了那么大的数组,A不掉。

遂STL快排解决之。问题就在如何统计重复数字上。

受到夏令营day1t1启发,快排后统计数字,每次和前边的进行比较,如果相等则当前数字重复,开一个vis数组打上标记,开一个b数组外带一个附带指针t,用来记录重复数字重复出现了几次。如果比较时发现数字不一致,就让t++,这样t最后记录的就是重复数字的数量。

输出这里,因为有两个循环控制变量,在冥思苦想for无果之后决定请出while(1)老爷子来。在循环外有一个变量i初值为1,一个变量st初值为0,分别控制输出数和输出数的个数。

如果发现有一个数没有打标记,那么这个数应该输出,输出的同时输出b[++st]+1。加1的原因是b只记录了重复数字出现了几次,没有算上原来的数,所以输出时要+1。输出一次后i++,判断st是不是≥t,如果是则说明所有数都输出完了(想一想,为什么),如果不是则继续输出。

这里有一个提速小技巧,在for的时候我使用了「寄存器变量」register int,这类变量不存放在内存里,而存放在cpu的寄存器里。大家应该知道寄存器的存取速度要比内存快的吧,这样定义变量可以加速操作。但是,register只能用于整型,字符型或指针型变量,而且,根据cpu的不同,寄存器变量一般只能同时开2~3个,如果你超出了这个限制,那么程序会自动把多的寄存器变量变成自动变量auto(不知道这是啥的同学自己去网上搜一下吧,我就不多展开了)。

AC代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 #define maxn 200005
 4 using namespace std;
 5 long long int a[maxn];
 6 long long int b[maxn];
 7 bool vis[maxn];
 8 long long int n,t=1;
 9 inline long long int read(){
10     long long int num = 0;
11     char c;
12     bool flag = false;
13     while ((c = getchar()) == ‘ ‘ || c == ‘\n‘ || c == ‘\r‘);
14         if (c == ‘-‘) flag = true;
15     else
16         num = c - ‘0‘;
17     while (isdigit(c = getchar()))
18     num = num * 10 + c - ‘0‘;
19     return (flag ? -1 : 1) * num;
20 }
21 int main(){
22     ios::sync_with_stdio(false);
23     n = read();
24     for (register int i=1;i<=n;i++){
25         a[i] = read();
26     }
27     sort(a+1,a+n+1);
28     for (register int i=2;i<=n;i++){
29         if (a[i] == a[i-1]){
30             b[t]++;
31             vis[i] = true;
32         }
33         else
34             t++;
35     }
36     int i = 1;
37     int st = 0;
38     while(1){
39         if (!vis[i])
40             cout << a[i] << " " << b[++st]+1 << endl;
41         i++;
42         if (st >= t)
43             break;
44     }
45     return 0;
46 }
时间: 2024-11-20 10:41:23

统计数字的相关文章

统计数字noip2007

7909:统计数字 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的数据满足:1<=n

7909:统计数字

7909:统计数字 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的

1164 统计数字

1164 统计数字 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入描述 Input Description 第1行是整数n,表示自然数的个数.第2~n+1 行每行一个自

统计数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数: 可定义一个用于统计数字个数的变量count,然后从前往后遍历数组,看是否与所求数字相等,如果相等,则count++: 下面贴出代码: public class Solution {     public int GetNumberOfK(int [] array , int k) {         int count = 0;        for(int i=0;i<array.length;i++){            if(array[i]==k

腾讯面试题(统计数字出现的次数问题)

时间:2014.04.28 地点:基地二楼 日志:知道自己没有尝试着去试图改变,晓得错了~~ ---------------------------------------------------------------- 一.题目: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数. 上排的十个数如下: [0,1,2,3,4,5,6,7,8,9] 举一个例子, 数值:0,1,2,3,4,5,6,7,8,9 分配:6,2,1,0,

[CareerCup] 18.4 Count Number of Two 统计数字2的个数

18.4 Write a method to count the number of 2s between 0 and n. 这道题给了我们一个整数n,让我们求[0,n]区间内所有2出现的个数,比如如果n=20,那么满足题意的是2, 12, 20,那么返回3即可.LeetCode上有一道很类似的题Factorial Trailing Zeroes,但是那道题求5的个数还包括了因子中的5,比如10里面也有5,这是两题的不同之处.那么首先这题可以用brute force来解,我们对区间内的每一个数字

POJ3067(树状数组:统计数字出现个数)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24151   Accepted: 6535 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas

统计数字问题

问题描述: 一本书的页码从自然数1开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如第6页用6表示而不是06或006. 数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9. 算法分析: 比如,对于一个数字34567,我们可以这样来计算从1到34567之间所有数字中每个数字出现的次数:从0到9999,这个区间的每个数字的出现次数可以使用原著中给出的递推公式,即每个数字出现4000次. 从10000到19999

ZJNU——统计数字(1402)

Description 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. Input 第1行是整数n,表示自然数的个数. 第2~n+1行每行一个自然数. Output 包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出.每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开. Sample Input 8 2 4