Description

开学了,ACM队的边老板想在学校中请一些妹子一起做一项问卷调查,调查妹子们对ACM的了解情况,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的妹子的编号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。老板怎么会自己去解决这么简单的问题了,所以就请你协助完成“去重”与“排序”的工作啦。

Input

第一行是一个正整数 T ,表示这一组测试数据的总个数。

每一组的第一行包含一个数N

每一组的第2行有N个用空格隔开的正整数,为所产生的随机数。

Output

对于每一组数据,输出为2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

Sample Input

2
10
20 40 32 67 40 20 89 300 400 15
3
1 2 3

Sample Output

8
15 20 32 40 67 89 300 400
3
1 2 3

这个题目描述就是一个不重复的计数排序,但是正因为如此,可以直接使用set容器。可重复的可以使用map容器。

计数排序很好理解,s[i]存的就是数字i的个数。不过需要初始化全为0。这样来一个i,s[i]就自加。

然后输出所有非0的s[i]的i,用flag控制一下空格输出。

这个算法的复杂度是O(max(n, p)),其中p为整个数列里的最大值,这里p <= 1000, n <= 100

但是使用set容器的话,只用把所有的数加入容器,然后顺序输出即可,复杂度是O(nlogn)

由于这里n比p小了一个数量级,所以第二种方法更快一点,事实证明第一种跑了2MS, 第二种跑了1MS。

代码:

计数排序版:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set> using namespace std; int s[], n, cnt, len; void Input()
{
int v;
memset(s, , sizeof(s));
cnt = len = ;
scanf("%d", &n);
for (int i = ; i < n; ++i)
{
scanf("%d", &v);
if (!s[v])
cnt++;
s[v]++;
len = max(len, v);
}
} void Output()
{
bool flag = false;
printf("%d\n", cnt);
for (int i = ; i <= len; ++i)
{
if (!s[i])
continue;
if (flag)
printf(" ");
printf("%d", i);
flag = true;
}
printf("\n");
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times < T; ++times)
{
Input();
Output();
}
}

set容器版:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set> using namespace std; void Input(set <int> &s)
{
int n, v;
scanf("%d", &n);
for (int i = ; i < n; ++i)
{
scanf("%d", &v);
s.insert(v);
}
} void Output(set <int> &s)
{
bool flag = false;
printf("%d\n", s.size());
set <int> :: iterator it;
for (it = s.begin(); it != s.end(); ++it)
{
if (flag)
printf(" ");
printf("%d", *it);
flag = true;
}
printf("\n");
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times < T; ++times)
{
set <int> s;
Input(s);
Output(s);
}
}

ACM学习历程—NPU1086 随机数 2015年陕西省程序设计竞赛网络预赛(正式赛)C题 (计数排序 || set容器)的更多相关文章

  1. ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)

    Description In graph theory, a matching or independent edge set in a graph G = (V , E) is a set of e ...

  2. ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推)

    Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...

  3. NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

    Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...

  4. ACM学习历程——HDU5137 How Many Maos Does the Guanxi Worth(14广州10题)(单源最短路)

    Problem Description    "Guanxi" is a very important word in Chinese. It kind of means &quo ...

  5. ACM学习历程—UESTC 1218 Pick The Sticks(动态规划)(2015CCPC D)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 题目大意就是求n根木棒能不能放进一个容器里,乍一看像01背包,但是容器的两端可以溢出容器,只要两端的木 ...

  6. ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)

    Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...

  7. ACM学习历程—SNNUOJ 1116 A Simple Problem(递推 && 逆元 && 组合数学 && 快速幂)(2015陕西省大学生程序设计竞赛K题)

    Description Assuming a finite – radius “ball” which is on an N dimension is cut with a “knife” of N- ...

  8. ACM学习历程—HDU5476 Explore Track of Point(平面几何)(2015上海网赛09题)

    Problem Description In Geometry, the problem of track is very interesting. Because in some cases, th ...

  9. ACM学习历程—HDU5478 Can you find it(数论)(2015上海网赛11题)

    Problem Description Given a prime number C(1≤C≤2×105), and three integers k1, b1, k2 (1≤k1,k2,b1≤109 ...

随机推荐

  1. POJ 1698 Alice&#39;s Chance(最大流+拆点)

    POJ 1698 Alice's Chance 题目链接 题意:拍n部电影.每部电影要在前w星期完毕,而且一周仅仅有一些天是能够拍的,每部电影有个须要的总时间,问能否拍完电影 思路:源点向每部电影连边 ...

  2. Java 9 模块解耦的设计策略

    1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...

  3. linux下的显示有中国农历的日历ccal

    1.linux下的显示有中国农历的日历ccal

  4. 高速修复汉澳sinox命令解释程序bash shell漏洞

    bash是linux默认命令行管理程序shell.汉澳 sinox也安装有,尽管sinox并没有默认使用bash.可是用户一旦使用就会可能被通过漏洞入侵,所以必须高速修复.尽管sinox使用freeb ...

  5. 10个迷惑新手的Cocoa&Objective-c开发问题

    本文转载至  http://blog.csdn.net/lvxiangan/article/details/27964733     language background run­time thre ...

  6. <转> Struct 和 Union区别 以及 对内存对齐方式的说明

    转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...

  7. EasyDSS高性能流媒体服务器前端重构(六)- webpack-dev-server 支持手机端访问

    很多时候,前端开发的页面,不仅要在PC端测试效果, 还要在手机端测试效果. 在开发阶段, 我们以 webpack-dev-server 来启动浏览器, 打开正在开发的页面. webpack-dev-s ...

  8. c#数组的count()和length的区别

    C# 数组中 Length 表示数组项的个数,是个属性. 而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样.但实际上严格地说 Count() 不是数组的内容,而是 IEnu ...

  9. 性能测试--Jmeter的Non GUI模式、集群

    Jmeter的Non GUI模式.集群 一.Non GUI模式 1.一般情况下在NonGUI模式下运行jmeter,有两个好处: 节省系统资源,能够产生更大的负载 可以通过命令行参数对测试场景进行更精 ...

  10. 【题解】cycle

    [题解]cycle 题目描述 给定一个无向图,求一个环,使得环内边权\(\div\)环内点数最大. 数据范围 \(n \le 5000\) \(m\le 10000\) \(Solution\) 考虑 ...