题意:
给定一到n的序列,按照下列规则,将序列排为升序列
1.交换前两个数
2.将最后一个数放在最前面(紫书错了,害惨我了)
数据量为300,刘汝佳提示是最多2*n*n次操作,所以我选择了数组模拟,正常数组无法将最后一个放到前面,所以我将数组倒置
因为没有要求最优解,只要能得到想要的结果就行了,所以采取了构造法
只要在第一个比第二个小,那么就把最后一个放到最前面,否则就交换前两个,这样就可以把大的慢慢往后放,如果n 1的情况,那么就要把最后一个放到最后面,不然就会陷入循环
例如4 2 3 1 2 4 3 1 1 2 4 3 3 1 2 4 1 3 2 4 4 1 3 2 1 4 3 2 2 1 4 3 1 2 4 3 (没有想明白为什么,各位看官明白的话,求留言)
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<cstdio> 5 using namespace std; 6 const int maxn=10000000+5; 7 8 int dp[maxn]; 9 10 int main(){ 11 int n; 12 while(cin>>n){ 13 vector<int> ans; 14 for(int i=n-1;i>=0;i--) 15 cin>>dp[i]; 16 int R=0,L=n-1; 17 while(1){ 18 int temp=1; 19 bool ok=1; 20 for(int i=L;i>=R;i--) 21 if(dp[i]!=(temp++)){ 22 ok=0;break; 23 } 24 if(ok)break; 25 if(dp[L]<dp[L-1]){ 26 ans.push_back(2); 27 dp[++L]=dp[R++]; 28 } 29 else{ 30 ans.push_back(1); 31 swap(dp[L],dp[L-1]); 32 } 33 } 34 for(int i=(int)ans.size()-1;i>=0;--i) 35 printf("%d",ans[i]); 36 printf("\n"); 37 } 38 return 0; 39 }
时间: 2024-12-19 01:02:04