poj1002 487-3279 ——水题

题目链接:http://poj.org/problem?id=1002

题目大意:

  给定一组电话号码,如果是包括字母,那么就映射到数字,统计相同的电话号码个数大于1的号码,按照从小到大的顺序输出,并且输出相应的个数。

题目思路:

  因为电话号码最多又7位数字,在整数范围内,把每个读入的电话号码转化成整数,用一个map记录是不是出现过,如果出现过,就把相应的map记录加1,如果没有出现过,就把这个数字放进一个数组arr里面,这样arr里面的数字是不重复的。最后把arr排序,对于每一个数组元素,输出相应的map记录,也就是它出现过的次数。

  输出的时候,按照整数输出,但是要注意,开始要输出3位,如果前面有0的话,按照整数输出就不行,所以要控制格式,用printf(“%03d”);这样的格式,表示前面要补齐0;卡住了,看得以前的代码才想到这种情况,还是思维不严谨 啊~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cctype>
 6 #include <vector>
 7 #include <map>
 8 #include <set>
 9 #include <stack>
10 #include <queue>
11 #include <cmath>
12 #include <algorithm>
13 #define lson l, m, rt<<1
14 #define rson m+1, r, rt<<1|1
15 using namespace std;
16 typedef long long int LL;
17 const int MAXN = 0x3f3f3f3f;
18 const int MINN = -0x3f3f3f3f;
19 const double eps = 1e-9;
20 const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
21   {1,1},{1,-1},{-1,-1}};
22 
23 int arr[100000+10];
24 map<char, int> ma;
25 char pri[10];
26 int main(void){
27 #ifndef ONLINE_JUDGE
28   freopen("poj1002.in", "r", stdin);
29 #endif
30     for (int i = 0; i < 5; ++i){
31       ma[i*3+'A'] = ma[i*3+1+'A'] = ma[i*3+2+'A'] = i + 2;
32     }
33   ma['P'] = ma['R'] = ma['S'] = 7;
34   ma['T'] = ma['U'] = ma['V'] = 8;
35   ma['W'] = ma['X'] = ma['Y'] = 9;
36   int n; scanf("%d", &n); char a[100]; map<int , int> cnt;
37   int k = 0, temp, i, j; cnt.clear();
38   for (i = 1; i <= n; ++i){
39     scanf("%s", a); int len = strlen(a), temp = 0;
40     for (j = 0; j < len; ++j){
41       if (isalpha(a[j])) {
42         temp = temp * 10 + ma[a[j]];
43       } else if (isdigit(a[j])){
44         temp = temp * 10 + (a[j] - '0');
45       }
46     }
47       if (cnt[temp] == 0){
48         cnt[temp]++; arr[k++] = temp; 
49       } else cnt[temp]++;
50   }
51   sort(arr, arr+k); bool flag = false;
52   for (i = 0; i < k; ++i){
53     if (cnt[arr[i]] != 1){
54       flag = true;
55       printf("%03d-%04d %d\n", arr[i]/10000,arr[i]%10000,cnt[arr[i]]);
56     }
57   }
58   if (!flag){
59     cout << "No duplicates.\n";
60   }
61 
62   return 0;
63 }

主要是为了练习一下STL,用来刷水题……看来自己做水题速度还是比较慢的。

posted on 2013-04-19 11:22  aries__liu  阅读(231)  评论(0编辑  收藏  举报