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

本文介绍了USACO编程竞赛中的Your Ride Is Here问题,讲解如何判断一组人是否能乘坐UFO前往指定星星。通过将名字转化为数字并计算与47的余数来确定匹配性。作者分享了初次尝试时遇到的错误,如忽略换行符和固定名字长度,并提供了答案代码中的关键点,包括ASCII码的使用和指针变量的处理。此外,文章提及了编程竞赛中常见的16种问题类型和解决策略,强调了算法对于程序员的重要性。
摘要由CSDN通过智能技术生成

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遍以上。

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

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

上边那个问题就是简单的杂项题。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值