Skip to content

tmzg-98/HuaweiCodeCraft2020

Repository files navigation

华为软件精英挑战赛

  • 队名:得得得得得得得得得得得得(出自lbw)
  • 赛区:江山赛区
  • 队友:WillyLiuwk

热身赛(warmup.cpp)

  • 热身赛为个人参加
  • 最后得分0.6130,76% PASSED,排名第124
  • 使用三层神经网络,隐层节点数设置为4(为了速度╮(╯﹏╰)╭ )
  • 里面用了各种加速的尝试,如多线程,NEON(后面再也没用到过了)等

初赛(preliminary.cpp)

  • 最后得分0.2308(江山赛区排名第23)
  • 主要方法是4+3(前向搜索4层,后向搜索3层)
  • 为了加速,search_thread写的非常冗长,来去除所有可能的多余操作
  • 通过打表输出(NUMTOSTR1,NUMTOSTR2,NUMTOSTR3),输出的字符串是在search_thread中直接生成的,后面再用mmap和memcpy复制到文件中
  • 为了加速,我们把几乎所有的stl容器都去掉,换成手动实现的结构
  • 最后几天,由于主办方突然默认可以针对线上数据进行优化,所以有如跳过id大于50000的点,不需要进行顶点映射等等等等的东西(那几天内卷是真的累)
  • (一开始得分比较差,5.多,在想到可以4+3后前进到1以内,后面各种优化到达0.29左右,在知道可以针对线上数据优化后到达0.23左右)

复赛(imtermediary_a.cpp,imtermediary_b.cpp)

  • a是复赛练习最好成绩(3.4772,江山赛区排名第11),b是16号下午的成绩(3.5524,江山赛区排名第2)
  • 复赛和初赛赛题变化不大,所以大部分方法是一样的
  • 比较重大的优化是,针对初赛写的,模拟vector的部分做了一个类似迭代器的struct,前进到4(后面就是各种波动优化……)
  • 16号最后比拼那一天,官方突然来了个大改动(要额外找8环),在最后20分钟成功debug出4+4版本的代码(前向4层,后向4层)
    • (非常惊险的感觉)

决赛(final_a.cpp,final_b.cpp)

  • test.sh是在决赛期间写的,为了能自动测试大批数据
    • 各种路径,测试的数据集需要在文件里定义的变量中指明
    • 如果输入一个参数,第一个参数需要是测试代码的路径,这样会测试所有的数据
    • 如果输入两个参数,第一个参数需要是测试代码的路径,第二个是测试的数据集的名称,这样会测试单个数据集
  • a是决赛练习最好成绩(390.9982,排名第8,但后面又做了一些优化,分数应该是更好些),b是30号下午的成绩(279.809,排名第6)
  • 决赛的赛题相比之前改动较大
  • 主要使用了Dijkstra,通过自己手写的8叉堆来构建前向图,再遍历构建出来的前向图,得到中心性最终的结果
  • 堆的部分,我们实现了两种堆,一种是以边作为元素,另一种是以距离作为元素
    • 前一种适合相同距离很少的情况(一般来说就是边权大,且不同)
    • 另一种适合边权小的情况(这样相同边权的边就可以存在一个数组里,减少堆结构变化的频率)
      • 然而最后官方只有第二种情况……,本来我们是有动态决策方法的(final_a.cpp),30号去掉了(final_a.cpp)
  • struct的结构对最后速度的影响非常大,我们一开始有一个非常大的struct,那时我们一千多,拆掉以后进步到一千内了
  • 还有就是各种对代码的打磨了
    • 比如,针对第一个数据集,把所有入度0,出度1的点和其后继点一起运算
    • 不过代码的可读性几乎完全丧失了
      • (没办法,为了速度/(ㄒoㄒ)/~~ )
  • 30号比较有意思的点是
    • 官方的图,不会有dist超过uint16_t的,因此可以把所有dist的结构变成uint16_t(从317.7798变到296.2949)
    • 还有就是,我们在最后几分钟加上了#pragma pack(2),又一下子从298.0132变到279.8090(简直惊了)
      • (不过不加这个pragma好像也能有三等奖就是了)

写在最后

  • 在初赛的时候,确实没想到我们能走到最后 ლ(́◉◞౪◟◉‵ლ)
  • 比赛中确实看到了很多大佬,代码也看过,我们有很大的差距
    • 复赛16号那一天也是靠了些运气,bug很快都找到了
    • 不过可能也是由于我们花的时间确实很多(每天电话讨论就要2小时),所以我们很多改动都能比较快,细节也进行了很深的优化
    • (而且也靠了些运气)
  • 我们也经常与其他选手进行交流,非常感谢一起比赛的各位(也确实共同进步了
  • 最后就是,两位队友确实非常给力,大家两个月一起花了无数的时间与精力,最后取得了成绩也算是有了回报了

About

2020华为软件精英挑战赛代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published