q___b552 2022-06-19 00:18 采纳率: 0%
浏览 87

用C语言编写狙击手存活问题

N个狙击手在进行生死搏斗,每位狙击手各瞄准了一个目标,一旦开枪就会将被瞄准的目标消灭,被消灭的狙击手无法再开枪。已知任意两个狙击手不会同时开枪,但不知道他们的开枪顺序,所以无法确定最后哪些狙击手会存活下来。
请你求出最少可能存活多少个狙击手,最多可能存活多少个狙击手。
输入描述:
第一行一个正整数N 接下来一行N个正整数,第i个数字Ti表示第i个狙击手瞄准了第Ti个狙击手,注意可能存在Ti=i

输出描述:
两行,第一行是最少存活的狙击手的数量,第二行是最多存活的狙击手的数量
示例1
输入
8
2 3 2 2 6 7 8 5
输出
3
5
请问该问题用C语言该怎么编呢?

  • 写回答

1条回答 默认 最新

  • 一个风轻云淡 后端领域优质创作者 2022-06-19 22:06
    关注

    #include<stdio.h>
    using namespace std;
    #define maxn 1000001
    int q[maxn],a[maxn],IN[maxn],die[maxn],undie[maxn];
    int n;
    int ans1,ans2,len,bo;
    int main()
    {
    int x;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);++IN[a[i]];
    }
    for(int i=1;i<=n;i++)
    if(IN[i]==0)
    {
    ++ans1;q[++ans2]=i;
    }
    for(int i=1;i<=ans2;i++)
    {
    x=a[q[i]];
    if(die[x])continue;
    die[x]=1;
    undie[a[x]]=1;--IN[a[x]];
    if(IN[a[x]]==0)q[++ans2]=a[x];
    }
    for(int i=1;i<=n;i++)
    if(IN[i]&&!die[i])
    {
    len=bo=0;
    for(int j=i;!die[j];j=a[j])
    {
    die[j]=1;
    ++len;
    bo|=undie[j];
    }
    if(!bo&&len>1)
    ++ans1;
    ans2+=len/2;
    }
    printf("%d\n%d",n-ans2,n-ans1);
    }

    评论

报告相同问题?

问题事件

  • 请采纳用户回复 6月28日
  • 创建了问题 6月19日

悬赏问题

  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息