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. 25:坐标移动CoordinateMove

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合 ...

  2. js 显示当前系统时间

    <div id="test"></div>                <script >                    setInt ...

  3. 五分钟了解 Service Mesh

      1 背景   1.1 多语言   微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++.Java.Golang.PHP.Pyth ...

  4. 【iOS开发-51】案例学习:动画新写法、删除子视图、视图顺序、延迟方法、button多功能使用方法及icon图标和启动页设置

    案例效果: (1)导入所需的素材,然后用storyboard把上半截位置和大小相对固定的东西布局起来.当然,这些控件也要定义成对应地IBOutlet和IBAction方便兴许使用它们. 注意:本案例在 ...

  5. SPOJ LCS2 - Longest Common Substring II 后缀自动机 多个串的LCS

    LCS2 - Longest Common Substring II no tags  A string is finite sequence of characters over a non-emp ...

  6. EasyDSS RTMP流媒体解决方案之直播录像自动清理方案

    本文转自Marvin的博客: http://blog.csdn.net/marvin1311/article/details/78660592 EasyDSS_Solution直播录像清理 直播录像, ...

  7. Mybatis之基本简介

    一.Mybatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML ...

  8. 九度OJ 1156:谁是你的潜在朋友 (并查集)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5802 解决:2593 题目描述: "臭味相投"--这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多 ...

  9. intellij idea使用技巧

    1 小窗口脱离了主窗口的解决办法 只要将floating mode和windowed mode取消掉就可以了,当选择上了floating mode和windowed mode之后会打一个勾,再次点击勾 ...

  10. 观察OnPaint与OnIdle与OnSize事件

    import wx class SketchWindow(wx.Window): def __init__(self, parent, ID): wx.Window.__init__(self, pa ...