zzuli oj 1204: 剔除相关数

来源:互联网 发布:淘宝pc端首页代码装修 编辑:程序博客网 时间:2024/03/29 06:56

题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1204


1204: 剔除相关数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 126  Solved: 61

SubmitStatusWeb Board

Description

一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。

Input

多实例测试。每组数据包含一个n(n<1000),和n个int范围内的正整数。若n为0,表示结束。

Output

按从小到大的顺序输出非相关数,若没有非相关数,则输出None。

Sample Input

8
213 667 3 213 43 34 677 2
3
322 232 232
0

Sample Output

2 3 667 677
None

HINT

Source


这个就是合理运用C++   STL 里面的map、 vector ,把每个数字 “标准化” ,即全部转化成从小到大的顺序,然后放到关联容器map中进行统计;

这个题和 UVa 156 反片语(Ananagrams, UVa  156)很像,只是一个是单词,一个是数字,有兴趣的可以去做做,另外 刘汝佳 — 算法竞赛入门经典 也有详细的讲解,好了,不多废话了,上代码:





#include<iostream>#include<algorithm>#include<vector>#include<map>#include<string>#include<cstdio>#include<cstring>#include<cctype>using namespace std;map<string, int> cnt;vector<string> w;string repr(string &s){    string ans = s;    sort(ans.begin(), ans.end());    return ans;}int main(){    int t, i;    string s;    while(scanf("%d", &t), t)    {        while(t--)        {            cin >> s;            w.push_back(s); //将数据存入数组w            string r = repr(s); // 排下数字的顺序            if(!cnt.count(r))                cnt[r] = 0;            cnt[r]++;        }        vector<string> ans;        int k = w.size();        for(i = 0; i < k; i++)            if(cnt[repr(w[i])] == 1)                ans.push_back(w[i]);        sort(ans.begin(), ans.end());        k = ans.size();        if(k == 0)//判断ans数组是否为空            printf("None\n");        else        {            //按要求输出            cout << ans[0];            for(i = 1; i < k; i++)                cout << " " << ans[i];            cout << endl;        }        ans.clear(); //数组和关联容器清空        w.clear();    }    return 0;}

































1 0
原创粉丝点击