poj1002 487-3279 ——水题
April 19, 2013
POJ
题目链接:http://poj.org/problem?id=1002 题目大意: 给定一组电话号码,如果是包括字母,那么就映射到数字,统计相同的电话号码个数大于1的号码,按照从小到大的顺序输出,并且输出相应的个数。 题目思路: 因为电话号码最多又7位数字,在整数范围内,把每个读入的电话号码转化成整数,用一个map记录是不是出现过,如果出现过,就把相应的map记录加1,如果没有出现过,就把这个数字放进一个数组arr里面,这样arr里面的数字是不重复的。最后把arr排序,对于每一个数组元素,输出相应的map记录,也就是它出现过的次数。 输出的时候,按照整数输出,但是要注意,开始要输出3位,如果前面有0的话,按照整数输出就不行,所以要控制格式,用printf(“%03d”);这样的格式,表示前面要补齐0;卡住了,看得以前的代码才想到这种情况,还是思维不严谨 啊~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long int LL;
const int MAXN = 0x3f3f3f3f;
const int MINN = -0x3f3f3f3f;
const double eps = 1e-9;
const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
{1,1},{1,-1},{-1,-1}};
int arr[100000+10];
map<char, int> ma;
char pri[10];
int main(void){
#ifndef ONLINE_JUDGE
freopen("poj1002.in", "r", stdin);
#endif
for (int i = 0; i < 5; ++i){
ma[i*3+'A'] = ma[i*3+1+'A'] = ma[i*3+2+'A'] = i + 2;
}
ma['P'] = ma['R'] = ma['S'] = 7;
ma['T'] = ma['U'] = ma['V'] = 8;
ma['W'] = ma['X'] = ma['Y'] = 9;
int n; scanf("%d", &n); char a[100]; map<int , int> cnt;
int k = 0, temp, i, j; cnt.clear();
for (i = 1; i <= n; ++i){
scanf("%s", a); int len = strlen(a), temp = 0;
for (j = 0; j < len; ++j){
if (isalpha(a[j])) {
temp = temp * 10 + ma[a[j]];
} else if (isdigit(a[j])){
temp = temp * 10 + (a[j] - '0');
}
}
if (cnt[temp] == 0){
cnt[temp]++; arr[k++] = temp;
} else cnt[temp]++;
}
sort(arr, arr+k); bool flag = false;
for (i = 0; i < k; ++i){
if (cnt[arr[i]] != 1){
flag = true;
printf("%03d-%04d %d\n", arr[i]/10000,arr[i]%10000,cnt[arr[i]]);
}
}
if (!flag){
cout << "No duplicates.\n";
}
return 0;
}
主要是为了练习一下STL,用来刷水题……看来自己做水题速度还是比较慢的。