题目描述

【背景】
ZCC又在打Isaac。这次他打通了宝箱关进入了表箱关。
【题目描述】
表箱关有一个房间非常可怕,它由n个变异天启组成。
每个天启都会在进入房间后吐出绿弹并炸向某一个位置且范围内只有一个天启。若该位置的天启已经死亡则没有事情发生,否则该位置的天启会死亡。每个天启只能且必须吐一次绿弹(除非在它吐弹以前他就挂了)。
绿弹的飞行速度很快,在某个绿弹落地之前不会有新的绿弹被吐出。
虽然房间的天启位置和吐弹位置固定,但是吐弹顺序是随机的,所以ZCC不能很好地制定策略。
现在ZCC想知道,最少和最多有几个天启被干掉。

输入

第一行n表示天启个数。
第二行n个数ai表示i号天启的目标是ai。
注意:行末有一个空格。

输出

一行两个数表示最少和最多有几个天启被干掉。

样例输入

8 2 3 2 2 6 7 8 5

样例输出

3 5

提示

【样例解释】

【数据范围】
测试点编号
n的范围
其他
测试点编号
n的范围
其他
1
=10
随机生成
6
=10000
处于一个联通块
2
=100
随机生成
7
=100000
所有天启都能被炸到
3
=1000
随机生成
8
=100000
4
=1000
随机生成
9
=1000000
处于一个联通块
5
=10000
随机生成
10
=1000000

题解

这道题刚开始弄了我很久,后来发现每个点只会向后连一条边,这样就少了很多种特殊情况

这道题要我们求最少和最多被干掉的天启数量

我们把图的情况想象成  单独一个环和其他的情况

求最少的数量

我们对于单独的环最少一定是干掉  (环的长度+1)/2  个天启

而对于其他的情况 我们就从入度为0的点开始往后找,把这些点标记掉,再找入度为0的点,这样继续,在判断的时候把干掉的加起来即可

求最大的数量

单独的环最后一定是只剩下一个(自环除外),自环就要特判一下

其他情况就只有入度为0的点存活,其他都会被干掉

怎么求单独的环呢?这个问题确实弄了我很久

其实我们可以先把入度为0的点向后找,边找边标记,一直找到找不了为止,这样剩下来的点就是构成环的点了

 1 #include<bits/stdc++.h>
 2 #define N 1000005
 3 using namespace std;
 4 int n,cnt,Max,Min,k,u,v;
 5 int a[N],in[N],s[N],flag[N];
 6 int calc(int u){
 7     flag[u]=1;
 8     int sum=1,v=u;
 9     while (!flag[a[v]]){
10         flag[a[v]]=1;
11         sum++;
12         v=a[v];
13     }
14     if (sum==1) sum=2;
15     return sum;
16 }
17 int main(){
18     scanf("%d",&n);
19     for (int i=1;i<=n;i++){
20         scanf("%d",&a[i]);
21         in[a[i]]++;
22     }
23     for (int i=1;i<=n;i++)
24         if (!in[i]) s[++cnt]=i,flag[i]=true;
25     int num=1;
26     while (num<=cnt){
27         k=s[num];
28         u=a[k];
29         if (!flag[u]){
30             Min++; flag[u]=true;
31             v=a[u];
32             in[v]--;
33             if (!in[v]){
34                 s[++cnt]=v;
35                 flag[v]=true;
36             }
37         }
38         num++;
39     }
40     for (int i=1;i<=n;i++)
41         if (!flag[i]) Min+=(calc(i)+1)/2;
42     memset(flag,0,sizeof(flag));
43     for (int i=1;i<=n;i++)
44         in[a[i]]++;
45     cnt=0;
46     for (int i=1;i<=n;i++)
47         if (!in[i]) s[++cnt]=i,flag[i]=true;
48     num=1;
49     while (num<=cnt){
50         k=s[num];
51         u=a[k];
52         if (!flag[u]){
53             Max++; flag[u]=true;
54             s[++cnt]=u;
55         }
56         num++;
57     }
58     for (int i=1;i<=n;i++)
59         if (!flag[i]) Max+=calc(i)-1;
60     printf("%d %d\n",Min,Max);
61     return 0;
62 }

View Code

转载于:https://www.cnblogs.com/zhuchenrui/p/7611060.html

YYHS-NOIP2017Training0928-ZCC loves Isaac相关推荐

  1. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  2. HDOJ 4876 ZCC loves cards

    枚举组合,在不考虑连续的情况下推断能否够覆盖L...R,对随机数据是一个非常大的减枝. 通过检測的暴力计算一遍 ZCC loves cards Time Limit: 4000/2000 MS (Ja ...

  3. HDU 4873 ZCC Loves Intersection(可能性)

    HDU 4873 ZCC Loves Intersection 题目链接 题意:d维的.长度为n的块中,每次选d条平行于各条轴的线段,假设有两两相交则点数加1,问每次得到点数的期望是多少 思路:自己推 ...

  4. HDU 5228 ZCC loves straight flush( BestCoder Round #41)

    题目链接:ZCC loves straight flush 题面: ZCC loves straight flush Time Limit: 2000/1000 MS (Java/Others)    ...

  5. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ZCC Loves Codefires Time Limit: 2000/1000 MS (Ja ...

  6. ZCC loves cube(cube)

    ZCC loves cube(cube) 题目描述 调戏完了狗,ZCC开始玩起了积木.ZCC的面前有一块n*n的棋盘,他要用这些1*1*1的积木在棋盘上搭出一个宏伟的建筑.积木有三种颜色,ZCC认为一 ...

  7. ZCC loves star

    ZCC夜观星象,企图找到宇宙的中心.根据某种伪科学思想,宇宙中心可以用 这种方法找到:把夜空中的星星两两分组,连接同组中的两颗星星,如果所 有组都交于同个点,且两两组之间仅有1个交点,那么这个交点就是 ...

  8. ZCC loves meat

    题目描述 ZCC终于打开了密码箱,发现里面只是一堆风干的肉条,于是他打算喂狗. ZCC养了n条狗,有m根肉条,他想把肉条一根不留地分给狗,并使得每条狗至少有一条肉条可吃.狗总是很贪心,它们不希望看到有 ...

  9. ssoj2503: ZCC loves meat(meat)

    时间限制: 1 Sec 内存限制: 512 MB Special Judge O2 提交: 109 解决: 35 [提交][状态][博客][加入收藏] 题目描述 ZCC终于打开了密码箱,发现里面只是一 ...

最新文章

  1. 导出swagger2生成的文档
  2. Opengl-光照-基本光照-光照贴图(现在告别单调的方块弄个箱子)
  3. 中国小孩为何普遍爱吃洋快餐?[转]
  4. how to balance between csdn and github?
  5. wxWidgets:wxBannerWindow类用法
  6. 我的GMAIL下蛋了,要的请留下姓,名和email!!
  7. 逆向知识第十讲,循环在汇编中的表现形式,以及代码还原
  8. 优秀!读博期间一作发10篇1区SCI,他坦言自己也曾走过弯路
  9. 下行文格式图片_谁能告诉我公文的下行文\上行文的模板
  10. 基于蓝墨云平台的计算机教学,基于蓝墨云班课平台的计算机应用基础翻转课堂教学研究 精读...
  11. 高中信息技术课程标准读后感
  12. [影评]《太阳照样升起》
  13. php数组匹配某一个元素的值
  14. 爬虫技术(05)神箭手爬虫回调函数
  15. MR混合现实头显来啦!宏碁微软产品率先上市
  16. 河北工业大学城市学院2019级 Java企业级系统管理期末复习资料
  17. 蓝牙BQB认证 Profile测试
  18. ObjectARX类库简介
  19. 什么是项目生命周期?如何划分项目阶段?有什么意义?
  20. C语言:判断两数是否互质

热门文章

  1. 【音视频】编/解码 - 编码器底层原理学习顺序
  2. 澳乐优,中国宝宝与澳洲牧场的美丽邂逅!
  3. OpenVINO 2022.3实战二:Window 10 环境下用 OpenVINO 2022.3部署yolov5-seg 7.0
  4. householder变换QR分解QR方法
  5. android提取pdf中文字,使用iTextG從Android上的pdf文件中提取文本
  6. php查询下级的下级,php如何高效找出所有下级
  7. 2021年金属非金属矿山(地下矿山)安全管理人员考试总结及金属非金属矿山(地下矿山)安全管理人员模拟考试题库
  8. 刷机介绍----超详细
  9. axure如何实现跳转_Axure中继器实现APP中设置页面的各种列表
  10. 日语高考生能报计算机,日语高考生能报计算机 日语练习册高考