清華大學2008年複試上機題 解題報告

九度OJ 題目1079:手機鍵盤
時間限制: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
提示:
    輸入時字母部分爲大寫,輸出時爲小寫,並且有大數據。


還沒做

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章