[ACM学习心得]关于sync_with_stdio(false);

来源:互联网 发布:特征选择算法 男女鞋码 编辑:程序博客网 时间:2024/05/16 09:02

在网上查看别人的ACM代码时,发现别人输入输出语句用的总是scanf与printf,有点不解,还以为他们用的都是C语言,而非C++,但今天做的一道题(Sort):

发现与网上的其他高手使用完全相同的方法,使用scanf及printf的代码提交后Accepted,而使用cin及cout的却Time Limit Exceeded,代码如下:

代码一(Accepted):

  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6. int n, m, num, count;
  7. while(scanf("%d%d",&n,&m)!=EOF){
  8. memset(a, 0, sizeof(a));
  9. for(int i=0; i<n; i++){
  10. scanf("%d",&num);
  11. a[num + 500000] = 1;
  12. }
  13. count = 0;
  14. for(int j = 1000000; j >= 0; --j){
  15. if(a[j]){
  16. if(count == m - 1){
  17. printf("%d\n",j-500000);
  18. break;
  19. }
  20. printf("%d ",j-500000);
  21. count++;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

代码二(Time Limit Exceeded):

  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6. int n, m, num, count;
  7. while(cin >> n >> m){
  8. memset(a, 0, sizeof(a));
  9. for(int i=0; i<n; i++){
  10. cin >> num;
  11. a[num + 500000] = 1;
  12. }
  13. count = 0;
  14. for(int j = 1000000; j >= 0; --j){
  15. if(a[j]){
  16. if(count == m - 1){
  17. cout << j - 500000 << endl;
  18. break;
  19. }
  20. cout << j - 500000 << " ";
  21. count++;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

可以看出,代码思路完全一样,只是输入输出方法不同,问过老师,加上这一句代码后使用cin及cout也可以Accepted:

  1. std::ios::sync_with_stdio(false);

百度了一下,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是iostream。

如需转载请注明出处:蓝飞技术部落格
0 0