有n个人,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。因此,对于不同的开枪顺序,最后死的人也不同。
标签:疑问 分享 for 开始 include mic output std png
有n个人,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。因此,对于不同的开枪顺序,最后死的人也不同。
输入n人数<1000000 每个人的aim
你要求最后死亡数目的最小和最大可能
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; const int MX=1000001; int n,mx,mn,q[MX],aim[MX],indu[MX]; bool die[MX],undie[MX]; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&aim[i]); indu[aim[i]]++; } for(int i=1;i<=n;++i) if(indu[i]==0) mn++,q[++mx]=i; int head=1; while(head<=mx) { int cur=q[head];head++; if(die[aim[cur]]) continue; die[aim[cur]]=1; int live=aim[aim[cur]]; indu[live]--; undie[live]=1; if(indu[live]==0) q[++mx]=live; } for(int i=1;i<=n;++i) if(indu[i] && !die[i]) { int len=0,flag=0; for(int j=i;!die[j];j=aim[j]) { len++; flag|=undie[j]; die[j]=1; } if(!flag && len>1) mn++; mx+=len/2; } printf("%d %d",n-mx,n-mn); return 0; }
标签:疑问 分享 for 开始 include mic output std png
原文地址:https://www.cnblogs.com/qseer/p/9740930.html