PAT 甲级 1067 Sort with Swap(0, i) (25分)本人暴力代码(原创,无抄袭)本人的水平真的有限,搞了很久暴力出的代码,一提交三个点运行超时,不得不放弃,学习晴神的代码和柳神的代码
本人代码贴上
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string>
int a[101000],b[101000];
using namespace std;
int main()
{
int changetime=0;
int have[101000],haves;
scanf("%d",&haves);
for(int i=0;i<haves;i++)
{
scanf("%d",&have[i]);
}
int flag=0;
for(int i=0;i<haves;i++)
{
if(have[i]==0)
{flag=i;
}
}
int temp;
int t=1;int w=2;
while(t>-1)
{
if(flag!=0){
for(int i=0;i<haves;i++)
{
if(have[i]==flag)
{if(have[i]!=have[flag])
{
swap(have[i],have[flag]);
flag=i;changetime++;/*cout<<changetime<<" ";
cout<<flag<<" ";*/break;
}
else {w=0;break;}
}
}
}
if(w==456)
{
break;
}
else if(flag==0)
{
for(int i=1;i<haves;i++){
if(have[i]!=i)
{flag=i;swap(have[0],have[i]);changetime++;/*cout<<changetime<<" ";
cout<<flag<<" ";*/break;}
else if(i==haves-1)
{
w=456;
break;
}
}
}
if(w==0)
{
break;
}
}
cout<<changetime;
}
逻辑可能着实让别人难以理解,敬请谅解!本人代码60行左右,还没AC。
晴神代码45行左右KO
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string>
int position[101000];
using namespace std;
int main()
{
int num,changetime=0,temp;;
scanf("%d",&num);
int shengyu=num-1;
for(int i=0;i<num;i++)
{
scanf("%d",&temp);
position[temp]=i;
if(temp==i&&temp!=0)
{
shengyu--;
}
}
int k=1;
while(shengyu)
{
if(position[0]==0)
{
while(k<num)
{
if(position[k]!=k)
{
swap(pos[k],pos[0]);
changetime++;
break;
}
k++;
}
}
while(position[0]!=0)
{
swap(position[0],position[position[0]]);
changetime++
shengyu--
}
}
cout<<changetime;
}
柳神代码25行KO,柳神的代码真的题题牛逼!
#include <iostream>
using namespace std;
int main() {
int n, t, cnt = 0, a[100010];
cin >> n;
for(int i = 0; i < n; i++){
cin >> t;
a[t] = i;
}
for(int i = 1; i < n; i++) {
if(i != a[i]) {
while(a[0] != 0) {
swap(a[0],a[a[0]]);
cnt++;
}
if(i != a[i]) {
swap(a[0],a[i]);
cnt++;
}
}
}
cout << cnt;
return 0;
}
————————————————
版权声明:本文为CSDN博主「柳婼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuchuo/article/details/52264805