輸入一組**(為了方便記憶存在帶有大寫字母的**號),統計重複出現的**號,標準化後按字典序輸出
**號碼的可能格式如下
888-glop
tut-glop
967-11-11
標準**號碼例項
888-4567 (3位+『-』+4位)
字母和數字的對映關係如下
a, b, 和c 對映到 2
d, e, 和f 對映到 3
g, h, 和i 對映到 4
j, k, 和l 對映到 5
m, n, 和o 對映到 6
p, r, 和s 對映到 7
t, u, 和v 對映到 8
w, x, 和y 對映到 9
沒有q和z
詳見 這題算比較簡單的,但聽說資料量比較大,演算法不能太慢。這個演算法跑了一秒左右,如果用字元儲存**,估計就gg了。
這裡先將**號碼轉換成int型,並採用map儲存。
之後直接輸出即可。
關於**號碼的轉換,採用手工存了個字元表進去,可以不用多個if或者switch,興許可以快一點。
由於poj莫名不能編譯我的map.insert(),改用tel_table[tel]++;的形式插入新的**。
cout的格式化輸出也比較有趣,經常會忘記,需要#include 。
#include
#include
#include
#include
using
namespace
std;
int main()
; for (int i = 0; i < 10; ++i)
tonum[48 + i] = i;
tonum['a'] = tonum['b'] = tonum['c'] = 2;
tonum['d'] = tonum['e'] = tonum['f'] = 3;
tonum['g'] = tonum['h'] = tonum['i'] = 4;
tonum['j'] = tonum['k'] = tonum['l'] = 5;
tonum['m'] = tonum['n'] = tonum['o'] = 6;
tonum['p'] = tonum['r'] = tonum['s'] = 7;
tonum['t'] = tonum['u'] = tonum['v'] = 8;
tonum['w'] = tonum['x'] = tonum['y'] = 9;
map tel_table;
int n, tel;
string str;
cin >> n;
while (n--)
//將tel插入umap中
//pair::iterator, bool> ret = tel_table.insert();
//if (!ret.second)
// ++ret.first->second;
tel_table[tel]++;
}//輸出重複出現的**
bool hasans = false;
map::iterator tel_it = tel_table.begin();
while (tel_it != tel_table.end())
hasans = true;
cout
<< setfill('0') << setw(3) << tel_it->first / 10000
<< "-";
cout
<< setfill('0') << setw(4) << tel_it->first % 10000
<< " ";
cout
<< tel_it->second << endl;
++tel_it;
}if (!hasans)
cout
<< "no duplicates."
<< endl;
return
0;}
為了方便只看到這篇文章的人測試。這裡給出poj的測試資料
12 4873279
its-easy
888-4567
3-10-10-10
888-glop
tut-glop
967-11-11
310-gino
f101010
888-1200
-4-8-7-3-2-7-9-
487-3279
310-1010 2
487-3279 4
888-4567 3
poj解題報告 1328
不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...
poj解題報告 2586
這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...
poj解題報告 2635
這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...