列表

详情


NC26008. 舔狗

描述

> “舔狗舔狗,
> 舔到最后,
> 一无所有。”

有 n 只舔狗,每只舔狗的心中都有自己朝思暮想的一位。

每个人虽然受到了一万次拒绝,还毅然第一万零一次鼓起勇气。

作为一个不食人间烟火的算法设计师,你早已看破红尘。但是,人世间的苦难仍让你挂念。看到众生在单恋中苦苦坚持,你决定普度众生,给大家找到一个最好的结局,让一无所有的舔狗尽量地少,让每个人都尽量能和自己喜欢的或喜欢自己的人修成正果。

也就是说,你需要给这 n 只舔狗配对,对于舔狗 i,他可以和他朝思暮想的人 配对。另外,喜欢 i 的其他舔狗也可以和他配对。你需要让没有被配对的舔狗尽量少。

输入描述

第一行一个 n,表示舔狗个数。
第二行 n 个数字,第 i 个数字表示第 i只舔狗的朝思暮想的一位的编号

输出描述

第一行一个数字,表示一无所有的舔狗的最小数量。

示例1

输入:

10
3 1 8 6 10 1 4 1 6 1

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 622ms, 内存消耗: 20060K, 提交时间: 2020-10-04 16:10:31

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+10;

struct node{int x,p;};
bool operator < (node a,node b){return a.p>b.p;}
priority_queue<node> q;

int n,a[N],d[N],v[N];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		d[a[i]]++;
	}
	for(int i=1;i<=n;i++)
	q.push({i,d[i]});
	while(!q.empty())
	{
		node k=q.top();
		q.pop();
		if(v[k.x]||v[a[k.x]]) continue;
		n-=2;
		v[k.x]=v[a[k.x]]=1;
		d[a[a[k.x]]]--;
		q.push({a[a[k.x]],d[a[a[k.x]]]});
	}
	cout<<n<<endl;
	return 0;
 } 

上一题