标签:维数 algorithm std mat als 题目 lse style 代码
题意:给定的一维数组中,每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]); } }
标签:维数 algorithm std mat als 题目 lse style 代码
原文地址:https://www.cnblogs.com/jianqiao123/p/12299957.html