C. Friends and Gifts

 Codeforces Round #611 (Div. 3)

题意:给定的一维数组中,每i个元素为f(i),f(i)有两种取值,若f(i)为0,表示第i人不知道将礼物给谁,若f(i)>=1&&f(i)<=n表示第i人将礼物送给第f(i)人,要注意题目规定每个人只能收一件礼物也只能发一件礼物给别人,而且不能自己给自己送礼物,题目要求你替不知道将礼物送给谁的人把礼物送出去,不能自己送自己,最后输出结果(只要改变原f(i)为0的数值)。

题解:官方题解用到图思想,这里用了另一种思路:将还没有分配的人和还没有被分配的人分别存进两个数组,挨个遍历,如果相同位置是同一个人,就和下一个交换;

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int MAXN=2e5+5;
int f[MAXN];
bool flag[MAXN]={false};
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>f[i];
		flag[f[i]]=true;
	}
	vector<int> a,b;
	for(int i=1;i<=n;i++)
	{
		if(f[i]==0) a.push_back(i);
		if(flag[i]==false) b.push_back(i);
	}
	int len=a.size();
	for(int i=0;i<len;i++)
	{
		if(a[i]==b[i])
		{
			int x=i,y=(i+1)%len;
			swap(b[x],b[y]);
		}
	}
	for(int i=0;i<len;i++) f[a[i]]=b[i];
	for(int i=1;i<=n;i++) cout<<f[i]<<" ";
	return 0;
}  
 

核心代码:

for(int i=0;i<len;i++)
	{
		if(a[i]==b[i])
		{
			int x=i,y=(i+1)%len;
			swap(b[x],b[y]);
		}
	}

  

天晴了,起飞吧
原文地址:https://www.cnblogs.com/jianqiao123/p/12299957.html