「 Luogu P1850 」 换教室】的更多相关文章

解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ 个时间段里哪一个时间段是申请换教室了的.所以此路不通,另寻他路---题解.天哪没有题解还咋做题啊 不妨再加入一维 $[0/1]$ 表示第 $j$ 个时间段有没有进行申请操作 那么就分为一下两种情况 第 $i$ 个时间段申请了 第 $i$ 个时间段没有申请 那么这两种状态分别是 $dp[i][j][…
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c_ici​ 上课,而另一节课程在教室 d_idi​ 进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程.如果学生想更换第 ii节课程的教室,则需要提出申请.若申请通过…
[Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造化如何. 总之自己这段时间多做好事,多积攒RP,每天RP++ Description Solution: 首先当你看完这个到题的时候,你应该想到先用floyd跑出任意两点的最短路,这个不解释 然后又是这种求期望值最小,很明显也会想到DP的做法 那么DP的方程?通过发现对于当前第i个课程教室的期望是跟…
换教室 期望DP 状态: f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望 方程: f[i][j][0]=min(f[i-1][j][0]+dis[cla[i-1]][cla[i]],f[i-1][j][1]+dis[ano[i-1]][cla[i]]*k[i-1]+dis[cla[i-1]][cla[i]]*(1-k[i-1]));f[i][j][1]=min(f[i-1][j-1][0]+dis[cla[i-1]][ano[…
LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变量名写重了僵硬了半天....被安排了 //Author: dream_maker #include<bits/stdc++.h> using namespace std; //---------------------------------------------- //typename typ…
期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> using namespace std; inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); ret…
传送门 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $ 2n $ 节课程安排在 $ n $ 个时间段上.在第 $ i $个时间段上 $ (1 \leq i \leq n) $,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $ c_i $ 上课,而另一节课程在教室 $ d_i $ 进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 $ n $ 节安排好的课程.如果学生想更换…
题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选不是随机的而是取最优的: 然后注意 double 类型不能 memset ,还是要手动赋值: 其实也不算很难,却调了很久... 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespa…
题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可以配成多少套完整的书册. 解题思路 我已开始直接建立超级源点汇点,然后源点$\rightarrow $练习册连边,练习册$\rightarrow $书连边,书$\rightarrow $答案连边,答案$\rightarrow $汇点连边.然后直接跑 $\text{Dinic}$.$\text{RE}…
先用Floyed做亮点之间的最短路,设计dp,记dp[i][j][0]为到第i节课,换了j次课,当前有没有换课达到的期望耗费体力最小值 方程(太长了还是看代码吧):dp[i][j][0]<-dp[i - 1][j][0]dp[i][j][0]<-dp[i - 1][j][1]dp[i][j][1]<-dp[i - 1][j - 1][0]dp[i][j][1]<-dp[i - 1][j - 1][1] ~~感觉跟没说一样~~ 初值: inf, dp[1][0][0] = dp[1]…
解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话线杆的高度 $j$.第 $i-1$ 个电话线杆的高度 $k$. 状态转移方程如下 $$dp[i][j] = \min \{dp[i-1][k]+|j-k|\times c + (j-h[i])^2\}$$ 但是这样的 $dp$ 过不了这题的数据范围.这个 $dp$ 的时间复杂度是 $\text{O}…
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\).他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为\(c\) 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为\(…
更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少.你能帮帮她吗? Input 第一行有两个整数\(n\),\(p\),代表学生数与增加分数的次数. 第二行有\(n\)个数,\(a_1 \sim a_n\),代表各个学生的初始成绩. 接下来\(p\)行,每行有三个数,\(x\),\(y\),\(z\),代表给第\(x\)个到第\(y\)个学生每人增…
更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1000)\) conveniently numbered \(1 \cdots N\) is going to attend the big cow party to be held at farm #X \((1 \le X \le N)\). A total of \(M (1 \le M \l…
更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今给定数列的两系数\(p\)和\(q\),以及数列的最前两项\(a_1\)和\(a_2\),另给出两个整数\(n\)和\(m\),试求数列的第\(n\)项\(a_n\)除以\(m\)的余数. Input 输入包含一行6个整数.依次是\(p\),\(q\),\(a_1\),\(a_2\),\(n\),\…
更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重排为值域上连续的一段. Input 第一行两个数\(n, m\): 第二行\(n\)个数表示\(a[i]\): 后面m行每行三个数opt x y,或者opt l r,代表操作. Output 如果可以,输出damushen: 否则输出yuanxing. Sample Input 5 5 1 2 3…
题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 "阻止","最小",看到这样的字眼,肯定就要想到最小割啊 在互相能到达的点之间建边,容量为INF,因为--它不能炸-- 然后把每个点拆成入点和出点,每个兵所在的出点和源点S直接相连,在最外面的点的出点和汇点T直接相连 最后套模板,OK了 最重要的还是建边,能够理解题目的…
数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我…
题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示数列中实数的个数和操作的个数. 第二行包含N个实数,其中第i个实数表示数列的第i项. 接下来M行,每行为一条操作,格式为以下两种之一: 操作13:1 x y k ,表示将第x到第y项每项加上k,k为一实数. 操作2:2 x y ,表示求出第x到第…
# 解题思路 这题不难,但是原谅我一开始的傻逼想法,一会儿再给大家透露透露. 先说怎么做这题. 显然对于 $0$ 和 $1$ 来说,异或无非也就只有两种变化 异或了奇数次,$0$ 就会变成 $1$,$1$ 就会变成 $0$. 异或了偶数次,$0$ 和 $1$ 都不变. 那只需要在下传标记的时候下传修改了几次就可以. 好,下面说说我那傻逼的操作.我在下传标记的时候没有给子节点的 sum 进行异或,而是只下传了标记,并且在回溯的时候没有更新父节点的 sum 值. 然后我成功的没过样例,然鹅这并不傻逼…
# 解题思路 修改,就是一个区间修改的常规操作,但是为了迎合查询的需要,对两端的不完整的块需要暴力重构,重新进行排序操作,保证每一块都是单调上升的顺序. 然后再说进行查询的操作,起初,我们需要在每一个块内进行排序.保证顺序时单调上升的(在每一个块内,是独立的),然后查询的时候对每一块($k$)都二分查找到大于 $num + tag[k]$ 的第一个数的位置,然后就可以得到一共有多少大于 $num$ 的数了. 值得注意的是,有些题解写的是对原序列直接进行排序,这就有一个错误,那就是在排序之后序列的…
# 解题思路 两点之间的路径的话一定经过它们两个 LCA,这一点已经是显而易见的,那么再来看看异或的性质. $$a\ xor\ b\ xor\ b = a\\ a\ xor\ a=0\\ a\ xor\ 0 = a\\ a\ xor\ b = b\ xor\ a\\ a\ xor\ b\ xor\ c = a\ xor\ (b\ xor\ c)$$ 再回到这个题上来,因为 $a\ xor\ b\ xor\ b = a$,所以从根节点出来的一条路径我们可以预先处理一个异或和出来. 在询问的时候再将…
# 解题思路 跑 $\text{n}$ 遍 $\text{spfa}$ 并记录路径,找到比当前最长路长的就更新答案,并且将路径也更新,注意起点的处理. # 附上代码 #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define INF 123456789 using namespace std; ], head[], cnt, pre[], Ans, ans…
# 题目大意 管理大大给修下 $\text{Markdown}$ 吧,严重影响做题体验啊. 这道题的意思很简单就是给你一个长度是 $n$ 的环,这个环上不均匀的分布着 $n$ 头奶牛.一头奶牛移动要花费的代价是距离的平方,现在让你求出使得每个点上都有一头奶牛需要花费的最小代价,注意,奶牛只能顺时针移动. # 解题思路 首先断环成链这个大家应该都知道,就是将原序列 copy 一份放到后面去. 然后考虑如果一头奶牛在移动的过程中没有经过其他奶牛,那这一定是最优的方案.还有就是如果一个点有奶牛,那将奶…
# 题目大意 真讨厌题面写的老长老长的. 这个题的意思就是给定一棵无根树,每个节点都有一个美丽值(可能是负数),可以删掉一些边来删除某些点,现在要求你求出可以删掉任意条边的情况下,这个树上的剩余节点的美丽值之和的最大值. # 解题思路 以每一个节点为根,做 $\text{dfs}$,考虑到这样的一个性质,如果一棵子树节点的美丽值之和为负数,那就可以将这棵子树全部删掉. 所以就在 $\text{dfs}$ 的同时记录一下子树的美丽值之和.如果你这样做的话,会得到 $70$ 分的好成绩(会 $\te…
# 解题思路 这题不难,主要就是考虑如何判重,如果直接在 $9$ 个位置上都比较一遍的话.你会得到下面的好成绩 所以考虑另一种方法: 将九个位置压成一个整数,并且因为只有九个数,所以不会超出 $int$,用 $set$ 判重,写一个 BFS 就过了 # 附上代码 #include<iostream> #include<cstdio> #include<queue> #include<set> using namespace std; struct node{…
# 题目大意 给出区间 $[a,b]$,求出区间中有多少数满足下列两个条件 不含有前导 $0$. 相邻两个数字之差的绝对值至少是 $2$. # 解题思路 数位 $DP$,用记忆化搜索来实现.设 $dp[i][j]$ 表示现在已经枚举到第 $i$ 位,第 $i+1$ 位是 $j$ 时一共有多少满足条件的数. 还是直接看代码里的注释吧. # 放上代码 #include <algorithm> #include <iostream> #include <cstring> #i…
题目描述可能稍有偏差,但实质上是一样的. 看下面 题目大意 题面这么长,先说说题意吧. 就是有一个操作系统,他的存储方式是树形的.其中分为文件和目录(文件夹)每一个子目录下只能存储 $K$ 个文件或目录.并且有 $K$ 个指针分别指向这 $K$ 个文件或文件夹.每一个指针都有一个访问时间 $P$. 然后每一个文件或目录都有一个访问时间,文件和目录的访问时间计算方式不相同 文件:访问其所有上级目录(就是这个文件访问路径上的文件夹)的访问时间加上这个文件的指针的访问时间. 文件夹:它的各级子目录下文…
解题思路 第一眼看上去觉得要设计一个三维的 DP,$dp[i][j][k]$ 表示在 $(i,j)$ 这个位置上 $k$ 时刻能够打死的最多的鼹鼠. 但是被数据范围卡死.完全开不开数组啊. 然后注意到题目中有句话说保证是按照时间递增序输入的. 想一下,某个鼹鼠能够被打死,是因为他之前被打死的鼹鼠走过来的. 所以只需要考虑每个鼹鼠之前的若干鼹鼠就可.只要两个鼹鼠的距离小于它们出现的时刻只差,那就可以扩展的到. 附上代码 #include <iostream> #include <cstri…
题目链接 戳我 \(Solution\) 这道题官方题解的做法太复杂了,还需要扫字符串. 其实只需要两个\(map\)就好了. 一个\(map<string,stirng>\)用来记录题目一个题面的答案是什么 一个\(map<string,char>\)用来记录答案是\("A","B","C","D"\)中的哪个 然后直接输出就好了,详细见代码 #include<bits/stdc++.h>…