通过一道水题发现的神奇操作
港真 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;居然在时间上有这么大的差距 决定好好的研究一番(然后以后都不用这个了哼唧)
如果有新的发现会再来更新的
以上。