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 }
  • 相关阅读:
    AtCoder Beginner Contest 167
    AtCoder Beginner Contest 166
    AtCoder Beginner Contest 165
    AtCoder Beginner Contest 164
    AtCoder Beginner Contest 163
    AtCoder Beginner Contest 162
    AtCoder Beginner Contest 161
    AtCoder Beginner Contest 160
    AtCoder Beginner Contest 159
    自定义Mybatis自动生成代码规则
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7465539.html
Copyright © 2011-2022 走看看