zoukankan      html  css  js  c++  java
  • 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]);
    		}
    	}
    

      

    天晴了,起飞吧
  • 相关阅读:
    [转]Torch是什么?
    去掉 CONSOLE 窗口(转)
    最短路径问题
    最短路,dijstra算法
    最短路,floyd算法,图的最短路径
    freckles
    还是畅通工程,最小生成树kruskal
    More is better
    畅通工程
    人见人爱
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/12299957.html
Copyright © 2011-2022 走看看