通过一道水题发现的神奇操作

港真 Accept之后又改动了几次靠评测姬试出来到底哪里卡时间 觉得这个代码实在是太神奇了

先上题面叭


 递归实现排列型枚举

题目描述

把 1~n 这 n(n<10) 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入

一个整数n。

输出

按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

样例输入

3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

一道递归水题经典题

先上TLE代码 耗时:1808ms

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int num[20],n;
 4 void solve(int ans){
 5     if(ans==n)
 6     {
 7         for(int i=0; i<n-1; i++) cout<<num[i]<<" ";
 8         cout<<num[n-1]<<endl;
 9     }
10     else
11     {
12         for(int i=1; i<=n; i++)
13         {
14             bool f=true;
15             for(int j=0; j<ans; j++) if(num[j]==i) f=false;
16             if(f)
17             {
18                 num[ans]=i;
19                 solve(ans+1);
20             }
21         }
22     }
23 }
24 int main() {
25     ios::sync_with_stdio(false);
26     cin.tie(0);
27     cin>>n;
28     solve(0);
29     return 0;
30 }

好像没什么问题

但是返回了一个橙色的大写TLE

经过我反复的试探发现

罪魁祸首是第8行代码

下面是AC代码 耗时:340ms

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int num[20],n;
 4 void solve(int ans){
 5     if(ans==n)
 6     {
 7         for(int i=0; i<n-1; i++) cout<<num[i]<<" ";
 8         cout<<num[n-1]<<"\n";
 9     }
10     else
11     {
12         for(int i=1; i<=n; i++)
13         {
14             bool f=true;
15             for(int j=0; j<ans; j++) if(num[j]==i) f=false;
16             if(f)
17             {
18                 num[ans]=i;
19                 solve(ans+1);
20             }
21         }
22     }
23 }
24 int main() {
25     ios::sync_with_stdio(false);
26     cin.tie(0);
27     cin>>n;
28     solve(0);
29     return 0;
30 }

 


 然后你就会发现 这一个输出的差距 竟然整整近差了1.5s 震惊!!!

发现这行代码的神奇之处后立马打开了博客决定写下来

"\n"和endl;居然在时间上有这么大的差距 决定好好的研究一番(然后以后都不用这个了哼唧)

如果有新的发现会再来更新的

以上。

 
posted @ 2018-08-03 13:07  阿枔  阅读(126)  评论(0编辑  收藏  举报