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<cstdio>
#include<cstring>
#include<set>
#include<iostream>
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<n;i++)
        {
            cin>>a;
            if(b[a]==0) b[a]=1,sum++;
            else  if(b[a]==1) b[a]=2,sum--;
        }
        cout<<sum<<endl;
        if(!sum) continue;
        for(int i=1;i<L;i++)
            if(b[i]==1)
            {
                if(flag) cout<<" "<<i;
                else flag=true,cout<<i;
            }
            cout<<endl;
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值