PAT 注意事项

前言

唉,这个OJ,不是很友好。

谨记下自己做题过程中的一些坑,既然改变不了这个OJ,只能改变自己了。


注意事项

cincout

可用的解决方法有:

1
ios::sync_with_stdio(false);

这一句可以提高一些速度,但是这样,cincout就不能与scanfprintf混用。


scanf,很不好的就是不能读入到string,很难过。cstring和std::string转换如下:

1
2
3
char *c_s = "hello";
std::string s = c_s;
printf("%s", s.c_str());

另外,不要用endl,真的很慢很慢,用"\n"


但是,很遗憾的是,std::string某些情况下,也很慢

std::string

如果输入限定了长度,尽量用reserve控制下,这样会快不少

1
2
int N = 10;
s.reserve(N);

mapset等慢

不要管什么优雅,政治正确,做对题是硬道理。PAT一般对空间复杂度要求不高,一些用到map之类的,可以考虑开一个很大的数组直接存。

getline()

注意如果之前cin读入一个数,后边还有换行,记得先getchar()

1
2
3
cin >> N;
getchar();
getline(cin, s);

总结

  1. 能全局就全局,省得传参
  2. 看空间要求,如果没有特别限制,能全开就全开,5w的数组都没有问题
  3. 不要用endl
  4. ios::sync_with_stdio(false); cin.tie(nullptr);
  5. string的时候,如果没有变长要求,用reserve,可以省不少时间
  6. 如果输出有较复杂格式要求,iomanip写不来,那就不要用cincout,否则可能超时
  7. scanf不支持std::string,考虑读到char*里,然后两者相互转换
  8. 如果遇到多个测试点没有过,多半是题意理解有问题,先不要找着一些奇奇怪怪的边界条件BUG