USACO习题:Your Ride Is Here
开题记:公司内部要做OI,同事拜托我去USACO上做题。我平时做题主要是在Project Euler上,USACO还是第一次听说,上去看看觉得还不错。因为考虑到要在内部开展,平时那么随意做做的话以后要讲起来不太方便,所以决定把解题思路记在这里。同时锻炼下我糟糕的C++。
题目很长,废话奇多无比。其实说白了,就是给两个单词,比较两个单词转换的数字是否对于47同余。
转换规则如下:A表示1,B表示2。。。Z表示26,给定一个单词,比如USACO,他的值为21 * 19 * 1 * 3 * 15 = 17955。17955 mod 47 = 1。
如果两个单词mod 47的余数相等,我们就输出GO,反之STAY。
注意:此题要求输出的长度只限制在6个字母,26^6 < 2^32,可以控制在一个整型以内。如果更多的话,你的乘法可能会溢出,这里就就要使用一些mod的运算来控制溢出。比如每6次乘法做一次mod运算。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
unsigned int word2value(string word);
int main() {
ofstream fout("ride.out");
ifstream fin("ride.in");
string comet,group;
fin>>comet>>group;
if ( word2value(comet) == word2value(group))
fout<<"GO";
else
fout<<"STAY";
fout<<endl;
fin.close();
fout.close();
return 0;
}
unsigned int word2value(string word) {
unsigned int value = 1;
for(string::iterator iter = word.begin();iter!=word.end();iter++){
value *= *iter - 'A'+1;
}
//cout<<word<<":"<<value<<endl;
return value% 47;
}