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遍以上。
一般在網絡上更容易出現這種雜項題。
如果你不能分清楚一個題到底是啥類型,你就一直把這個題當雜項題做吧哈哈哈。
上邊那個問題就是簡單的雜項題。