Problem 108 Your Ride Is Here

先来个最简单的,也是USACO的第一个问题。Story就不复述啦,和程序没什么关系。输入文件有两行字符串,全部都是大写字母,不用考虑非法输入(比如夹杂数字等)。字母对应到数字分别从1-26,即,A=1,B=2,。。。,Z=26。转换好以后,把它们分别乘起来除以47取模,如果两行结果相等,输出GO,否则输出STAY。char到int的转换对学过c的朋友来说再简单不过了,ASCII代码有现成的映射,做加减法就可以啦。

没什么难度,纯粹用来熟悉USACO的环境和提交系统

/*
ID: username
LANG: C++
PROG: ride
*/

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(){
 string s1,s2;
 int    i1,i2;
 
 ifstream fin("ride.in");

fin>>s1>>s2;
 fin.close();
 
 i1 = i2 = 1;
 
 string::iterator i;
 for(i = s1.begin(); i != s1.end(); ++i) i1 = (((*i) - 64) * i1) % 47;
 for(i = s2.begin(); i != s2.end(); ++i) i2 = (((*i) - 64) * i2) % 47;
 
 ofstream fout("ride.out");
 if(i1 == i2) fout<<"GO"<<endl;
 else fout<<"STAY"<<endl;
 
 fout.flush();
 fout.close();
}


fin>>s1>>s2;
 fin.close();
 
 i1 = i2 = 1;
 
 string::iterator i;
 for(i = s1.begin(); i != s1.end(); ++i) i1 = (((*i) - 64) * i1) % 47;
 for(i = s2.begin(); i != s2.end(); ++i) i2 = (((*i) - 64) * i2) % 47;
 
 ofstream fout("ride.out");
 if(i1 == i2) fout<<"GO"<<endl;
 else fout<<"STAY"<<endl;
 
 fout.flush();
 fout.close();
}

注意,源文件最后带一个回车,头上注明用户名,语言及程序的名字。

备注:USACO把这道题目的难度降低了,原来的测试数据可没有现在那么客气,才6个字母。当初我这个初学者在这里可是跌了一个大大的跟头,它的grader system给出了一个超长的字符串,好像有将近100位。。。。。。要是你没意识到这有什么问题,我给你点hint:int的表示范围有多少?想一下worst situation:26^100,不要说int,double都表示不出来那么大的数字。先全部乘起来然后再对47取模显然是不现实的。上面的程序是得到一个数字就取一次模,然后再和下一个数字相乘,如此,就避过了这个问题。我当初对这个问题苦思1天1夜,猜到了这个结果,自己拿了几个数字实验了一下发现是对的,然后就赌博似的提交给grader system去运行。实事证明,我猜对了,它给的analysis也是这么做的。不过为什么这样是正确的,恕我愚钝,想不到数学证明。猜想应该和数论啊,同余之类的定理有关。哪位高手能指点一下我多年的疑惑么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值