您的位置:首页 > 其它

USACO1.1 PROB Your Ride Is Here 比较分析

2015-12-15 21:17 225 查看
PROB Your Ride Is Here

有些星星上会有UFO来接地球人上去玩,但是这个UFO一次只能有一组人过去。所以要让这组人知道他们被选中了。方法是这样的,星星的名字和组名能确定一个小组该去哪儿。然后我们就要写一个程序,判断一组人是不是能去那个星星玩。

组名和星星名都能转化成数字,A就是1,Z就是26,按照字母顺序递增。举个例子,USACA就是21*19*1*3*15=17955。如果这个组名和星星名对应的数除以47的余数相等,意味着他们可以准备出发了。

写一个程序读星星名和组名,如果能去的话打印GO,如果不能去打印STAY。名字没有空格和标点符号最多有六个字母。

(默认是大写字母)

下边是自己写的代码,因为难度不大也不涉及什么算法所以就不写注释了。但是一直提交了好几次才过,第一个原因是因为开始忘记了在输出结果‘'\n',题目里明明还提示了,真是太愚蠢了。第二个原因是写死了名字的长度,没注意是最多有6个也可以少于6个。

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

using namespace std;
int buffer[2][6];

int main()
{
string line;
int i = 0;
int result[2]={1,1};
int length;

ofstream fout ("ride.out");
ifstream fin ("ride.in");
if(fin)
{
while(getline(fin,line))
{
length = line.size();
for(int j = 0; j < length; j++)
{
buffer[i][j] = (int)line[j];
buffer[i][j] = buffer[i][j] - 64;
result[i] = result[i]*buffer[i][j];
}
i++;
}
}
if(result[0]%47 == result[1]%47)
{

fout<<"GO\n";
}
else
{
fout<<"STAY\n";
}
return 0;
}


下边是测试的数据:



成功运行会出现这样的结果:



下边是答案给出的解法:

#include <stdio.h>
#include <ctype.h>

int
hash(char *s)
{
int i, h;

h = 1;
for(i=0; s[i] && isalpha(s[i]); i++)
h = ((s[i]-'A'+1)*h) % 47;
return h;
}

void
main(void)
{
FILE *in, *out;
char comet[100], group[100];  /* bigger than necessary, room for newline */

in = fopen("input.txt", "r");
out = fopen("output.txt", "w");

fgets(comet, sizeof comet, in);
fgets(group, sizeof group, in);

if(hash(comet) == hash(group))
fprintf(out, "GO\n");
else
fprintf(out, "STAY\n");
exit (0);
}
一个C语言的代码,分析一下它的流程,文件读写是C的方式。写了一个函数用来比较,和我代码里使用的方式是相似的,用ascii码来计算字母对应的数字。

A的ASCII码是64,在汇编语言中A与a的ASCII码都经常使用。在进行与字母有关的计算时考虑ASCII码会容易很多,否则不能写26个if啊。

答案比我多出一个判断是否为字母的情况,值得学习。还有指针型变量简直我的弱项。

Programming Contest Problem Types

Hal Burch在1999年的初春搞了个分析,他发现算法只有16种问题。基本上IOI中80%的问题都出自其中。这些问题如下:

动态规划

贪心

完全路径

填色问题

最短路径

递归

最小生成树

背包问题

几何问题

网络流

欧拉路径

凸边形问题

大数问题

启发式搜索

近似搜索

杂项题(参考网络翻译)

最复杂的就是组合问题了,里边各种问题嵌套啊组合什么的可麻烦了。如果你能解决上述问题的40%,你就能在IOI里边拿银牌了,如果有80%金牌就妥妥的了。当然啦,这很难,多做题才能多提高。

 补充一下:我发现几乎所有的算法我都学过了,也大概知道咋描述,但真让我码代码我就废了

所以程序猿的等级高低还是看算法啊。

Ad Hoc Problems

杂项题就是没啥固定解法的算法问题。每个问题都是不一样的,所以也就没啥固定的套路。

当然啦,这种问题就很欢乐,每遇到一个就是一个新挑战。一般这些问题都需要搞一个新型数据结构,循环和条件都跟人不一样。有时,由于太罕见了它们还要一些特别的组合方式。

做这种题就要仔细读,使劲读,把里边乱七八糟的东西全找出来。然后还要注意要优化,不可能你一下子循环5遍以上。

一般在网络上更容易出现这种杂项题。

如果你不能分清楚一个题到底是啥类型,你就一直把这个题当杂项题做吧哈哈哈。

上边那个问题就是简单的杂项题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  USACO 入门