POJ還沒做過的,今天偶然看到網易有道有個topcoder編程比賽,過幾天就是入圍賽了,趕緊報了個名,拿不到名次拿件T恤也好。
正好也自己練練手~今天抽點時間做了兩道POJ的弱題,慢慢恢複手感ing
發現用C++還是比以前在學校時用純C要好,STL很強大。
以後將長期A題玩~
1003 枚舉,典型的先產生表,然後根據資料查表。產表O(N) 查表O(1)
題目:
How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We're assuming that the cards must be perpendicular to the table.) With two cards you can make the top card overhang the bottom one by half a card length, and the bottom one overhang the table by a third of a card length, for a total maximum overhang of 1/2 + 1/3 = 5/6 card lengths. In general you can make n cards overhang by 1/2 + 1/3 + 1/4 + ... + 1/(n + 1) card lengths, where the top card overhangs the second by 1/2, the second overhangs tha third by 1/3, the third overhangs the fourth by 1/4, etc., and the bottom card overhangs the table by 1/(n + 1). This is illustrated in the figure below.
Sample Input
1.003.710.045.190.00
Sample Output
3 card(s)61 card(s)1 card(s)273 card(s)
代碼
#include <iostream>using namespace std;int main(){float r[1000] = {0};r[1] = 0.5;for(int i=2;i<1000;i++){float s = i;float tmp = 1/(s+1);r[i] = r[i-1] + tmp;}float n;while(cin>>n){if( n == 0)break;for(int i=0;i<999;i++){if( r[i] < n && r[i+1] >=n ){cout<<i+1<<" card(s)"<<endl;break;}}}return 0;}
1006 枚舉 完全就是小學數學題,O(N)硬舉就過了:
人生來就有三個生理周期,分別為體力、感情和智力周期,它們的周期長度為23天、28天和33天。
每一個周期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力周期的高峰,人會思維敏捷,精力容易高度集中。
因為三個周期的周長不同,所以通常三個周期的高峰不會落在同一天。對於每個人,我們想知道何時三個高峰落在同一天。
對於每個周期,我們會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。
你的任務是給定一個從當年第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天
的時間(距給定時間的天數)。例如:給定時間為10,下次出現三個高峰同天的時間是12,則輸出2(注意這裡不是3)。
Sample Input
0 0 0 00 0 0 1005 20 34 3254 5 6 7283 102 23 320203 301 203 40-1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days.Case 2: the next triple peak occurs in 21152 days.Case 3: the next triple peak occurs in 19575 days.Case 4: the next triple peak occurs in 16994 days.Case 5: the next triple peak occurs in 8910 days.Case 6: the next triple peak occurs in 10789 days.
#include<iostream> #include<stdio.h>#define MAXN 21252using namespace std;int main(){int a,b,c,d;int count=1;while( cin>>a>>b>>c>>d ){if( a == -1)break;int r = 1;while( r<=MAXN ){if( (r+d-c)%33==0 &&((r+d-b)%28==0) &&((r+d-a)%23==0)){cout<<"Case "<<count<<": the next triple peak occurs in "<<r<<" days."<<endl;break;}r++;}count++;}return 0;}
1002 雜湊表,用靜態記憶體不夠(百萬級),我這用的STL的map,根據KEY自動有序,太爽了,連排序都省了。
瓶頸在產生雜湊表O(nlogn)——map實際結構是二叉樹,產生的時候自動做了logn的排序。
企業喜歡用容易被記住的電話號碼。讓電話號碼容易被記住的一個辦法是將它寫成一個容易記住的單詞或者短語。例如,你需要給滑鐵盧大學打電話時,可以撥打TUT-GLOP。有時,只將電話號碼中部分數字拼字成單詞。當你晚上回到酒店,可以通過撥打310-GINO來向Gino's訂一份pizza。讓電話號碼容易被記住的另一個辦法是以一種好記的方式對號碼的數字進行分組。通過撥打必勝客的“三個十”號碼3-10-10-10,你可以從他們那裡訂pizza。
電話號碼的標準格式是七位十進位數,並在第三、第四位元字之間有一個串連符。電話撥號盤提供了從字母到數位映射,映射關係如下:
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沒有映射到任何數字,連字號不需要撥號,可以任意添加和刪除。 TUT-GLOP的標準格式是888-4567,310-GINO的標準格式是310-4466,3-10-10-10的標準格式是310-1010。
如果兩個號碼有相同的標準格式,那麼他們就是等同的(相同的撥號)
你的公司正在為本地的公司編寫一個電話號碼薄。作為品質控制的一部分,你想要檢查是否有兩個和多個公司擁有相同的電話號碼。
Input
輸入的格式是,第一行是一個正整數,指定電話號碼薄中號碼的數量(最多100000)。餘下的每行是一個電話號碼。每個電話號碼由數字,大寫字母(除了Q和Z)以及串連符組成。每個電話號碼中只會剛好有7個數字或者字母。Output
對於每個出現重複的號碼產生一行輸出,輸出是號碼的標準格式緊跟一個空格然後是它的重複次數。如果存在多個重複的號碼,則按照號碼的字典升序輸出。如果輸入資料中沒有重複的號碼,輸出一行:
No duplicates.
Sample Input
124873279ITS-EASY888-45673-10-10-10888-GLOPTUT-GLOP967-11-11310-GINOF101010888-1200-4-8-7-3-2-7-9-487-3279
Sample Output
310-1010 2
487-3279 4
888-4567 3
#include<iostream>#include<string>#include<map>using namespace std;#define MAXN 1000000long prase( string k ){long r = MAXN;long result = 0;for(long i=0;i<k.length();i++){if( k[i]>='0' && k[i]<='9'){long s = k[i] - '0';result += s*r;r = r/10;}if( k[i]>='A' && k[i]<='Y' ){long s;if(k[i]=='Q')continue;if( k[i] == 'A' || k[i] == 'B' || k[i] == 'C' )s=2;if( k[i] == 'D' || k[i] == 'E' || k[i] == 'F' )s=3;if( k[i] == 'G' || k[i] == 'H' || k[i] == 'I' )s=4;if( k[i] == 'J' || k[i] == 'K' || k[i] == 'L' )s=5;if( k[i] == 'M' || k[i] == 'N' || k[i] == 'O' )s=6;if( k[i] == 'P' || k[i] == 'R' || k[i] == 'S' )s=7;if( k[i] == 'T' || k[i] == 'U' || k[i] == 'V' )s=8;if( k[i] == 'W' || k[i] == 'X' || k[i] == 'Y' )s=9;result += s*r;r = r/10;}}return result;}int main(){map<long,long> hash;long n;cin>>n;for(long i=0;i<n;i++){string tmp;cin>>tmp;long code = prase(tmp);map<long,long>::iterator found = hash.find( code ); if ( found != hash.end() ){hash[code]++;}else{hash[code]=1;}}bool flag = false;for(map<long,long>::iterator iter = hash.begin(); iter != hash.end(); ++iter ){if( iter->second > 1){long head = iter->first/10000;long cut = iter->first%10000;printf("%.3ld-%.4ld %ld/n",head,cut,iter->second);flag = true;}}if(!flag)cout<<"No duplicates."<<endl;return 0;}