時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:208 解決:116
題目描述:
按照手機鍵盤輸入字母的方式,計算所花費的時間
如:a,b,c都在“1”鍵上,輸入a只需要按一次,輸入c需要連續按三次。
如果連續兩個字符不在同一個按鍵上,則可直接按,如:ad需要按兩下,kz需要按6下
如果連續兩字符在同一個按鍵上,則兩個按鍵之間需要等一段時間,如ac,在按了a之後,需要等一會兒才能按c。
現在假設每按一次需要花費一個時間段,等待時間需要花費兩個時間段。
現在給出一串字符,需要計算出它所需要花費的時間。
輸入:
一個長度不大於100的字符串,其中只有手機按鍵上有的小寫字母
輸出:
輸入可能包括多組數據,對於每組數據,輸出按出Input所給字符串所需要的時間
樣例輸入:
bob
www
樣例輸出:
7
7
//清華2010:題目1079:手機鍵盤
//(a-z)->(97-122); (A-Z)->(65-90)
//減掉96後(a-z)->(1-26)即爲字母序號
#include <iostream>
#include <string>
#include <memory.h>
#include <fstream>
using namespace std;
int a[1000], b[1000], c[1000], len;
void init( string s ){
memset( a, 0, sizeof(a) );
memset( b, 0, sizeof(b) );
len = s.length();
for( int i=0; i<len; i++ ){
a[i] = s[i]; //此時a記錄ASCII碼
a[i] -= 96; //a記錄字母號
if( a[i]<19 ){ //s之前[含]
b[i] = (a[i]-1)/3 + 1; //b記錄對應手機按鍵號
c[i] = (a[i]-1)%3 + 1; //c記錄在該按鍵上的次序 亦即按鍵次數
}else if( a[i]==19 ){
b[i] = 6;
c[i] = 4;
}else{
b[i] = (a[i]+1)/3;
c[i] = (a[i]+1)%3 + 1;
}
if( a[i]==26 ){
b[i] = 8;
c[i] = 4;
}
//if( b[i]%3 == 1 && c[i] == 1 ) cout << endl;//
//cout << b[i] << " " << c[i] << "||";//
}
};
int main(){
string s;
ifstream cin("THU_1079.txt");
while( cin >> s ){
init( s );
int consume = c[0]; //先加上第一個字母的按鍵數
int extra = 0;
for( int i=1; i<len; i++ ){ //從第二個字母開始循環
consume += c[i];
if( b[i]==b[i-1] )
extra += 2;
}
consume += extra;
cout << consume << endl;
}
system("pause");
return 0;
}
九度OJ 題目1080:進制轉換
時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:456 解決:69
題目描述:
將M進制的數X轉換爲N進制的數輸出。
輸入:
輸入的第一行包括兩個整數:M和N(2<=M,N<=36)。
下面的一行輸入一個數X,X是M進制的數,現在要求你將M進制的數X轉換成N進制的數輸出。
輸出:
輸出X的N進製表示的數。
樣例輸入:
16 10
F
樣例輸出:
15
提示:
輸入時字母部分爲大寫,輸出時爲小寫,並且有大數據。
還沒做