POJ解題報告 1002 487 3279

2021-07-29 14:13:51 字數 2328 閱讀 7191

輸入一組**(為了方便記憶存在帶有大寫字母的**號),統計重複出現的**號,標準化後按字典序輸出

**號碼的可能格式如下

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,要保證素數...