USACO习题:Your Ride Is Here

本文介绍了一道USACO竞赛题目的解决方案,该题目要求判断两个单词通过特定规则转换后的数值是否对47同余。文章给出了C++实现代码,并讨论了如何避免整数溢出的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开题记:公司内部要做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;
}



转载于:https://www.cnblogs.com/lzyzizi/archive/2012/03/18/2404668.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值