上周参加了一个区的程序员技能比赛的初赛,其实就是算法比赛,虽然最后结果是过了初赛,但过程真是一言难尽啊。
这次的算法比赛和ACM非常类似,虽然我大学是数学专业,虽然大学也修过ACM这门课,但是我的算法是真的不行,很菜很菜的那种。

好在这次比赛是组(抱大腿)队模式,3人一组,3个小时时间,一共7道算法题,1入门,2简单,2中等,2困难。
由于我知道我比较菜,所以比赛一开始,我就挑了一个看起来最简单的题目做,难题交给队友。
结果是3个小时过去,这个看起来最简单的题目,愣是没有做出来,下面就结合这道题讲讲我的心路历程。
这道题的描述是这样的:

看起来文字很多,其实要表达的很简单,就是输入一些成绩,每个成绩输进去时,如果超过全班最好成绩则输出prefect,如果超过自己的最好成绩则输出great,如果没超过自己最好成绩则输出bad。
是不是很简单?用一个max变量保存全班最好成绩,用一个map保存每个人的最好成绩,不就解决了吗?
不过这是我第一次用这个oj系统,连用户都是刚注册的,所以我还特地看了一会输入输出的demo,这次比赛只能使用ACM的输入输出模式,例如如果用的是Go语言,输入输出应该是这样:

学会了输入输出之后,一口气写入如下的解法:
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- var n int
- var name string
- var x float32
- var max float32
- scores := make(map[string]float32, n)
-
- fmt.Scan(&n)
- for i := 0; i < n; i++ {
- fmt.Scan(&name, &x)
-
- if x > max || i == 0 {
- fmt.Println("perfect")
- max = x
- scores[name] = x
- } else {
- if s, ok := scores[name]; ok {
- if x > s {
- fmt.Println("great")
- scores[name] = x
- } else {
- fmt.Println("bad")
- }
- } else {
- fmt.Println("great")
- scores[name] = x
- }
- }
- }
- }
在我正得意,觉得这题10分钟就能解决的时候,提交上去的代码竟然超时了,在比赛时没有截图,提交后显示有少数用例超过了2秒,oj的判定原理是准备一堆测试用例,