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

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

一般在網絡上更容易出現這種雜項題。

如果你不能分清楚一個題到底是啥類型,你就一直把這個題當雜項題做吧哈哈哈。

上邊那個問題就是簡單的雜項題。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章