您的位置:首页 > 其它

Gym - 100971B-思维-特殊情况

2017-05-19 16:48 239 查看
https://cn.vjudge.net/contest/164409#problem/B

给定一个序列,如果他的序号和他的值一样,那么他就是不正经的。

问你最少经过多少次操作,能够他们都变成正经的(值和序号都不一样)

要是偶数 直接就除以2就行,奇数就加1.

偶数两两交换,

奇数随便拉一个本来就不符合情况的值和他交换(是地址还是值不用考虑,哈哈,真的,就是顺序问题)

第一个wrong了。。

随手打了一个1 2 3 4 5 和 5 4 3 2 1

发现这种情况没有正经的数。。。

只好特判,当不正经的数有一个 或者没有时(只有一个,也没办法和本身换啊。),从正经数里找一个。

否则的话从队列了随便拉一个。.。

这一道题好像有一次的更换题。。

都是要注意特判的条件,不能一劳永逸,想当然。思维要缜密。

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=200008;
int main()
{   int m;
int a[maxn];
vector<int>q;
int x;
int y;
scanf("%d",&m);
bool flag=false;
for(int i=1;i<=m;i++)
{scanf("%d",&a[i]);
if(a[i]==i)
q.push_back(a[i]);
else y=a[i];
}
if(q.size()>1)
x=q[0];
else  x=y;
printf("%d\n",q.size()/2+q.size()%2);
if(q.size()%2==0)
{for(int i=0;i<q.size();i+=2)
{  printf("%d %d\n",q[i],q[i+1]);
}
}
else {
if(q.size()%2==1)
{  printf("%d %d\n",q[q.size()-1],x);
for(int i=0;i<q.size()-1;i+=2)
printf("%d %d\n",q[i],q[i+1]);

}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: