CH-Round-#63-OrzCC杯#2省选热身赛

题目一

描述

exchange

背景

有n个人一同出去玩,每个人有一张火车票。由于火车票实行实名制,每张火车票也对应一个人。

描述

由于某种原因,现在出现了以下情况:每个人手中有一张票,这张票可能是自己的也可能是别人的。现在任意两个人之间可以交换手中的票,求最少进行多少次交换使得每个人都拿到自己的票。假定交换是依次进行的,即同一时刻只进行一次交换,我们也想知道,第一步有多少种方案,能保证交换次数最少。

输入格式

输入有2行,第一行有两个用空格隔开的正整数n、k(k代表任务种类,详见输出格式),第二行有n个用空格隔开的正整数,第i个为Pi,代表着第i个人手中的票是第Pi个人的。

输出格式

如果k=1,那么输出只有一个整数,表示最少交换的次数;如果k=2,那么输出有两行,第一行是一个整数,表示最少交换的次数,第二行有一个整数,表示第一步的方案数。


分析

  • 找到所有的循环, 每个循环中置换次数是这个循环中元素的个数-1. 把所有的都加起来就得到总次数. 这个可以参考codevs的排序的代价, 不过这里代价都是0.
  • 如果再来做第二问, 在一个循环中, 假设循环中元素的个数是n, 第一步选两个元素交换, 第一个元素有n种选择, 第二个元素有n-1种选择. 最终交换a和b与交换b和a是一样的, 所以这个循环中第一步选择的方案数是n*(n-1)/2.

题目二

描述

在某一时刻,存活的狮子有地位高低之分,能力值高的地位高,能力值相同的当中年龄大的地位高。任何时刻,地位最高的狮子可以吃掉地位最低的狮子,但如果这样做,地位最高的狮子能力值会减少它吃掉的狮子的能力值。假定所有狮子都足够聪明,并且在保证自己不死的前提下会尽量吃掉别的狮子。现给出每个狮子的年龄和能力值,求哪些狮子死了。

输入格式

输入有2行,第一行有一个正整数n。第二行有n个用空格隔开的正整数,按年龄从小到大依次给出每个狮子的能力值,并按输入顺序编号为1~n。

输出格式

输出有2行,第一行有一个整数m,表示死去的狮子的个数。第二行有m个用空格隔开的正整数,为死去的狮子在输入中的编号(请从小到大输出)。


分析

  • 看来直接递归是最好的办法了.

    在递归过程中用一个栈来保存先后死掉的狮子. 先假设当前最厉害的狮子A吃掉了最弱的狮子B, 递归下一层直到只剩一只狮子, 然后返回处理, 如果当前A在后来被吃掉了, 那么狮子A一定不会吃掉B, 就在栈中找到B, 把它和以上的元素都退栈. 吃掉的狮子个数修改为当前的递归层数.

  • 还有其他办法不用递归, 但都看不太懂. 递归最直接了.
  • 狮子的信息可以用pair存, 自动按两维排序.

题目四

描述

背景

有两种液体A和B,等量混合时完全反应生成气体挥发不留渣;不等量混合时等量部分发生上述反应,多出部分留下。

描述

现有n个杯子排成一排,每个杯子里装有一种液体。我们可以进行若干次如下操作:选择两个相邻的杯子,这两个杯子中的液体种类必须是不同的,将其中一个杯子里的液体全部倒入另一个杯子中(杯子容积很大,不考虑溢出),反应充分之后拿走所有空杯子(拿走空杯子可以使原本不相邻的杯子变得相邻)。给出一个初始状态,求最少剩下多少个杯子。

输入格式

输入有n+1行,第一行有一个正整数n,接下来的n行,每行格式为“Vi Ki”,Vi为一正整数,表示这排杯子从左数第i个杯子的液体量,Ki为一个字符A或B,表示这排杯子从左数第i个杯子里液体的种类。

输出格式

输出有一个整数,表示最少剩下的杯子数。


分析


代码

https://code.csdn.net/snippets/615224

时间: 2024-12-24 20:04:41

CH-Round-#63-OrzCC杯#2省选热身赛的相关文章

【置换群】CH Round #63 - OrzCC杯#2省选热身赛 exchange

第一问置换群裸题. 第二问单独考虑某个循环,任意交换两个元素,稍微画一下就会发现,把该循环拆成了2个,剩下所需的交换次数减少了1,也就是说,第一步我们任意交换,都能够保证交换次数最少.于是一个循环的答案就是n*(n-1)/2,把所有的加起来即可. 进而我们发现,在剩下的步骤里面,我们只需在拆出来的两个循环里任意交换即可. #include<cstdio> using namespace std; #define N 50001 bool vis[N]; int n,op,a[N],sumv,s

【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强联通分量的其他城市,这个过程的代价也就是这个强联通分量的城市数-1,且他可以选择任何一个其中的城市离开这个强联通分量.于是我们求出所有强联通分量,记录下每一个包含的城市数,然后缩点.接下来再用dfs,由于数据是构造的,只能得到60分. 100分算法:在缩点之后,这个图变成了一个有向无环图,我们将一条边连向

CH Round #59 - OrzCC杯NOIP模拟赛day1

第一题:队爷的新书 题意简述:给定n个闭区间,求出一个数p使它与包含它的区间数的积最大,输出这个积. 分析:使用一个差分数组g,每个区间[l,r],l位置加1,r+1的位置减1,从前往后统计,得到对于每个p包含它的区间个数,相乘看是否最大.由于数据较大,需要离散化. program book; var a,f,g:array[0..200001]of qword; l,r:array[0..100001]of longint; n,i,m:longint; sum,ans:qword; proc

【题解】CH Round #61 取数游戏

取数游戏 CH Round #61 - 「Adera 10」冬令营热身赛 描述 SJY和CYF在玩一个取数游戏.他们将1~n分别写在n张纸上,随机排成一排,约定SJY先取,只能取走最边上的两张纸之一,然后CYF取:以此循环下去,取到1的人获胜.假设SJY和CYF足够聪明,求SJY获胜的概率. 输入 一个整数n 输出 SJY获胜的概率,保留最简分数形式(若为1,则输出1/1:若为0,则输出0/1). 样例 样例输入1 2 样例输出1 1/1 样例输入2 3 样例输出2 2/3 数据范围与约定 40

CH Round #17 舞动的夜晚

舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的,这样的认识关系一共有T对.舞会上,每位员工会尝试选择一名Ta认识的对方公司的员工作为舞伴,并且每位员工至多跳一支舞.完成的交际舞的数量越多,晚会的气氛就越热烈.顾及到晚会的气氛,员工们希望知道,哪些员工之间如果进行了交际舞,就会使整场晚会能够完成的交际舞的最大数量减小. 输入格式 第一行三个整数N

CH Round #45 能量释放

能量释放 CH Round #45 - alan有一些陷阱 III 题目描述 alan得到一块由个能量晶体构成的矿石,对于矿石中的每一个能量晶体,如果用化学物质刺激某一个能量晶体,就能使它释放能量. 它的能量释放强度与晶体本身的能量值以及能量晶体的位置有关. 为了方便研究,alan做了如下的定义. 能量集:一块矿石中的第个能量晶体到第个能量晶体(包含和,)构成的集合. 能量储存点:对于一块矿石中的能量晶体和,若有,则称是能量储存点. 能量释放点:在一个能量集中,若存在一个能量晶体,使得除它之外的

CH Round #52 还教室[线段树 方差]

还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教室的同学们纷纷归还自己当初租借的教室.请你来解决类似于借教室的另一个问题.[问题描述]在接受借教室请求的 n 天中,第 i 天剩余的教室为 a i 个.作为大学借教室服务的负责人,你需要完成如下三种操作共 m 次:① 第 l 天到第 r 天,每天被归还 d 个教室.② 询问第 l 天到第 r 天教室

CH Round #30 摆花[矩阵乘法]

摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了.假定每种花数量无限,求摆花的方案数. 输入格式 输入有1+m行,第一行有两个用空格隔开的正整数n.m,m表示花的种类数.接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种花和第j种花不能排在相邻的位置,输入保证对称.(提示:同一种花可能不能排在相邻位置). 输出格式 输出只有一

CH Round #57 - Story of the OI Class 凯撒密码

很有意思的一道题目 考场上想的是HASH成一个整数,把末位asicc码值*1,依次乘*10,得到一个整数,然后利用等差性.唯一性快排Nlogn乱搞的 证明如下: 对于明文abcde 密文 bcdef 有(a-b)*10000+(b-c)*1000+(c-d)*100+(d-f)*10+(e-f)*1=一个常数 这个常数我们可以预处理出来,对于任意的f[a,b],a,b属于小写字母,我们都可以预处理出来其值 好吧就是这个考场上写挂了 预处理出来之后依次排序维护标号然后O(n)一遍过就好,哎傻了 C