【作业向】程序设计思维与实践 Week8作业
♔A 区间选点 II
♔Problem
给定一个数轴上的 n 个区间,要求在数轴上选取最少的点使得第 i 个区间 [ai, bi] 里至少有 ci 个点
使用差分约束系统的解法解决这道题
♔Input
输入第一行一个整数 n 表示区间的个数,接下来的 n 行,每一行两个用空格隔开的整数 a,b 表示区间的左右端点。1 <= n <= 50000, 0 <= ai <= bi <= 50000 并且 1 <= ci <= bi - ai+1。
♔Output
输出一个整数表示最少选取的点的个数
♔Example
♔Input
1 | 5 |
♔Output
1 | 6 |
♔解题思路
这一题用差分约束的方法来做的话就需要构造不等式组,其中
- 记sum[i]表示数轴上[0,i]之间选点的个数
- 对于第i个区间[ai, bi]需要满足sum[bi] - sum[ai - 1] ≥ ci
- 同时还要保证0 ≤ sum[i] - sum[i- 1] ≤ 1
(除此之外,由于点的编号从0开始,ai-1会小于0导致数组越界,故将各点整体加1
♔代码
1 |
|
♔B 猫猫向前冲
♔Problem
众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫。
有一天,TT 在 B 站上观看猫猫的比赛。一共有 N 只猫猫,编号依次为1,2,3,…,N进行比赛。比赛结束后,Up 主会为所有的猫猫从前到后依次排名并发放爱吃的小鱼干。不幸的是,此时 TT 的电子设备遭到了宇宙射线的降智打击,一下子都连不上网了,自然也看不到最后的颁奖典礼。
不幸中的万幸,TT 的魔法猫将每场比赛的结果都记录了下来,现在他想编程序确定字典序最小的名次序列,请你帮帮他。
♔Input
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示猫猫的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即编号为 P1 的猫猫赢了编号为 P2 的猫猫。
♔Output
给出一个符合要求的排名。输出时猫猫的编号之间有空格,最后一名后面没有空格!
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
♔Examples
♔Input
1 | 4 3 |
♔Output
1 | 1 2 4 3 |
♔解题思路
对于每一组a胜过b,构建一条从a指向b的有向边,然后进行拓扑排序。特别的,对于输出时要求编号小的队伍在前,因此存储入度为0的节点的编号的队列使用按升序排序的优先队列。
♔代码
1 |
|
♔C 班长竞选
♔Problem
大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗?
♔Input
本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n <= 5000, 0 <m <= 30000),接下来有 M 行包含两个整数 A 和 B(A != B) 表示 A 认为 B 合适。
♔Output
对于每组数据,第一行输出 “Case x: ”,x 表示数据的编号,从1开始,紧跟着是最高的票数。 接下来一行输出得票最多的同学的编号,用空格隔开,不忽略行末空格!
♔Examples
♔Input
1 | 2 |
♔Output
1 | Case 1: 2 |
♔解题思路
这一题首先要对建好的图求强连通分量,然后将各强连通分量缩成一个点并对缩号的点进行反向建图,从各入度为零的点开始跑dfs,记录他们所能到达的所有强连通分量的点数总和ppsum[i],然后对各ppsum[i]求max,求得的max-1即为答案(因为要去掉自身),然后对各点进行判断,若该的所在的强连通分量的ppsum为取得的最大值,则将该点输出。
(又及:在跑dfs时因为建返图时会有重边,因此要注意对重边的处理
♔代码
1 |
|