2015 年 JXNU_ACS 算法组寒假第一次周赛 1005 数以稀为贵

数以稀为贵

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/2400K (Java/Other)
Total Submission(s) : 30   Accepted Submission(s) : 0

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

给出n个数,在这n个数当中有些数共出现过1次,有些数共出现过2次,有些数共出现3次......有些数出现过n次。
物以稀为贵,所以现在小KD只对出现过1次的数感兴趣,他请你帮他编一个程序帮他找一下,并按升序输出。

Input

第一行有一个正整数t,代表共有t组测试数据。
每组测试数据有两行,第一行输入一个n,表示有n个数,n的取值范围是[1,10^6]
第二行有n个数字。每个数字的大小范围[1, 10^6]。

Output

每组数据对应的输出有两行。
第一行输出一个整数,表示出现一次的数的个数。
第二行按升序输出出现次数为一次的数字,两个数字之间用空格隔开。

Sample Input

3
5
1 2 2 3 3
7
1 2 2 3 4 4 2
2
2 2

Sample Output

1
1
2
1 3
0

Author

JXNU_WY 

本题算法都很容易想到,但这不是我要考察的地方。这题考的是分析能力。
首先,你要对各种数据类型所占的内存大小要一目了然。题目卡了内存。限定内存为2400K。
值得一提的的是:bool类型 在java里是占一位,c和c++是一个字节。
如果本题你开一个整形数组,那么可以计算一下所花费的总字节为:
4*1000000/1024=3906K
显然超内存。
如果本题你开两个bool数组所花费的总字节为:
2*1000000/1024=1953K
如果再加上程序里其他一些变量,那么还是超内存。
那么还有一种数组你们没想到哦,那就是字符数组。
字符数组每个元素占一个字节,故有128种状态,故开一个就够了。
所花费的总字节为:976K
再加上程序里其他一些变量所占的内存,那也游刃有余。
下面是C++的参考代码
#include
#include
#include
#include
using namespace std;
const int L=1000005;
char b[L];
int main()
{
    int n,a,t;
    cin.sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>n;
        bool flag=false;
        memset(b,0,sizeof(b));
        int sum=0;
        for(int i=0;i>a;
            if(b[a]==0) b[a]=1,sum++;
            else  if(b[a]==1) b[a]=2,sum--;
        }
        cout<


你可能感兴趣的:(比赛)