题目链接: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,用来刷水题……看来自己做水题速度还是比较慢的。