zoukankan      html  css  js  c++  java
  • 统计数字

    原题链接: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 == '
    ' || c == '
    ');
    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 }
  • 相关阅读:
    秦曾昌人工智能课程---6、Decision Tree Learning
    秦曾昌人工智能课程---5、KNN和朴素贝叶斯
    秦曾昌人工智能课程---4、梯度下降算法
    我和最小二乘法的二三事
    英语影视台词---The Professor
    秦曾昌人工智能课程---3、机器学习中的哲学
    python从入门到大神---1、初始化实例、类属性、方法
    秒懂神经网络---震惊!!!神经网络原来可以这么简单!
    秦曾昌人工智能课程---2、机器学习中的数学基础2
    linuxc_螺纹锁紧pthread_mutex_t
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7465539.html
Copyright © 2011-2022 走看看