洛谷P1246C语言,[洛谷] P1097 统计数字

Loading...

# P1097 统计数字

> 我又来水题了(连 **普及-** 的题目都不放过)

## 题目描述

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

## 题目标签

算法标签:模拟,排序,概率论

## 输入格式

共 **n + 1** 行。

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

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

输出格式

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

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

## 题解

> 本帖搬运自 [小卓的博客 - LuoGu][xzblog] (~~我抄我自己~~)

很简单的一道题:套个快排模板,再做下简单的处理就行了。

看到很多大佬先排序再处理重复的数据,而我的做法是先处理掉重复数据再排序。

```cpp

#include

#include

using namespace std;

map stat;

long long a[200005];

// 快排模板(不多说)

void qsort(long long a[], int left, int right) {

if(left < right){

int i = left;

int j = right;

int x = a[left];

while(i

{

while(i < j && a[j] > x){

j--;

}

if(i < j){

a[i++] = a[j];

}

while(i < j && a[i] < x){

i++;

}

if(i < j){

a[j--] = a[i];

}

}

a[i] = x;

qsort(a,left,i - 1);

qsort(a,i + 1,right);

}

}

int main(){

int n, rn = 0,df = 0;

// rn 用于存放最终被排序的数量

// df 用于存放当前偏差值(循环偏差)

cin >> n;

for(int i = 1; i <= n; i++){

long long x;

cin >> x;

// 检查输入的值是否已存在

if(stat[x] == 0){

stat[x] = 1;

a[i - df] = x; // 存入数组

// 这里的偏差是我临时想出来的解决方法:

// 本循环会读入部分重复的值

// 这些值并不会被存入数组,会导致 a 数组有空间为0

// 增加 diff 后可以规避这种问题

// 出现一次重复就在下一次新存放值时对 i - 1

rn ++; // 统计结果数

}else{

stat[x] ++; // 出现次数 ++

df ++; // 偏差值 ++

}

}

qsort(a,1,rn); // 调用快排函数

// 输出最终的结果

for(int i = 1; i <= rn; i++){

long long num = a[i];

cout << num << " " << stat[num] << endl;

}

return 0;

}

```

这种做法可以使重复数据不进入排序程序中,而是直接进行统计。

> 好久没更新博客了,水道题就跑 ffb4b53b14a6cb6df7ed67a216c57835.png

[xzblog]: https://www.luogu.com.cn/blog/mrxzx/ti-xie-p1097-tong-ji-shuo-zi-post

最后修改:2020 年 08 月 22 日 10 : 00 PM

© 允许规范转载

赞赏

如果觉得我的文章对你有用,请随意赞赏

×Close

赞赏作者

扫一扫支付

png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAABS2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+IEmuOgAAAA1JREFUCJljePfx038ACXMD0ZVlJAYAAAAASUVORK5CYII=

png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAABS2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+IEmuOgAAAA1JREFUCJljePfx038ACXMD0ZVlJAYAAAAASUVORK5CYII=

支付宝支付

微信支付

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值