洛谷P2949题解】的更多相关文章

若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多少利润. Method: 做这道题的时候并没有想到反悔贪心,只是想到一个错误的贪心算法.按照截止时间为第一关键字,利润为第二关键字排序,统计一遍即可. 显然上面的贪心算法刻印被Hack掉.可以先不选择当前截止时间的利润,等一下选择下一个更大的利润,这样可以得到更大的最优解. 但我们发现这个贪心策略错…
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起点我们一般称为源点,终点一般称为汇点 内容前置 1.增广路 ​ 在一个网络从源点S到汇点T的一条各边剩余流量都大于0(还能让水流通过,没有堵住)的一条路. 2.分层 ​ 预处理出源点到每个点的距离(每次寻找增广路都要,因为以前原本能走的路可能因为水灌满了,导致不能走了).作用是保证只往更远的地方放水…
P2949 [USACO09OPEN]工作调度Work Scheduling 题目描述 Farmer John has so very many jobs to do! In order to run the farm efficiently, he must make money on the jobs he does, each one of which takes just one time unit. His work day starts at time 0 and has 1,000…
本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \(1,2...N\) ( \(N\) 为参赛总人数). 设 \(x_{ij}\) 分别表示编号为 \(i\) 的选手第 \(j\) 项竞赛的成绩 \((1 \le i \le N\),\(1 \le j \le 8)\) .其它指标如下: 第 \(j\) 项竞赛的平均分 $ avg_j = \fra…
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示(我就不贴图) 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见炮兵的攻击范围不受…
不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示…
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断开这两个点的边,使其变为一棵普通树.以其中的一点为树根做树形DP,再以另一点为树根再做一次树形DP,因为相邻的两点不能同时选,所以最后统计一下 \(f(i)(0)\) 与 \(g(j)(0)\) 的最大值即可. 定义 \(f(i)(0/1)\) 为第一次树形DP的 \(i\) 点的最优解,\(g(i…
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数有限制,所以我们用贪心,将数据存入结构体在根据每一条线隔开的同学对数排序,得出前k条横线和前l条纵线就是要分割的通道. 因为题目要求输出按照\(a_i<a_{i+1}\),\(b_i<b_{i+1}\). 所以我们在根据\(a_i\)和\(b_i\)从小到大排序. 上代码 #include<…
P2949 [USACO09OPEN]工作调度Work Scheduling 题目描述 Farmer John has so very many jobs to do! In order to run the farm efficiently, he must make money on the jobs he does, each one of which takes just one time unit. His work day starts at time 0 and has 1,000…
这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简单 的DP,相信大家也可以很容易地吧DP状态转移方程给推出来.我就献丑给大家推一遍,如有错漏,请留言,谢谢. 我们可以定一个函数 \(f(i)\) ,它表示跳到 \(i\) 棵树上去的 \(f(i)\) 的劳累值.由题可知,可以 \(i-v,i-v+1,i-v+2,......i-2,i-1\) 棵…
别碰我! 自己还是太蒟了…… 看了好久,最后抄参考题解打出来的…… 前面的可能影响后面的,所以按照询问右端点排序 这时候维护一个前缀和数组就可以了, 那么问题又来了,去重? 可以这样,从前往后枚举,如果被加过了就在前面去掉 具体看代码(题目毒瘤导致卡常卡了好几遍): #include<bits/stdc++.h> #define rint register int #define lowbit(x) (x&(-x)) using namespace std; ],a[],vis[],o…
这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向…
题面 本人用的是暴力分类讨论 + \(unordered\_map\) 存储,与所有的题解都不同. 因为 \(n \leq 6\) ,非常的小,并且我不想写 DFS,所以直接暴力分类讨论 \(n=1,n=2,\dots,n=6\) 的情况. 当 \(n \leq 3\) 时,可以用循环嵌套来解决,这里就不再赘述了. 当 \(n > 3\) 时,暴力循环去做的时间复杂度达到了 \(O(m^n)\) ,无法通过本题,所以考虑优化(以 \(n=6\) 为例,其余类推):先枚举 \(x_1,x_2,x_…
题意 Link 求 \[\sum_{i=1}^{2^n}\log_2\left(\prod_{j=1}^i\operatorname{lowbit}(j)\right) \] \(n\le 2^{64}\) . 题解 Update. 好像有更简单做法 . 有趣题 . 首先这个 \(\log\) 可以丢到里面去吧 \[\sum_{i=1}^{2^n}\sum_{j=1}^i\log_2(\operatorname{lowbit}(j)) \] 然后这个 \(\log_2(\operatorname…
题目 这个题主要是一个考分类讨论的模拟题,做这个提的时候首先要脑子清醒,才可以清楚地写出怎么模拟来. \(Code\) #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cstdio> #define N 100100 using namespace std; int n, k, ans[N], cv[N]; int m…
正解:贪心+并查集(umm不用并查集也成qwq 解题报告: 水题?主要感觉想到了俩方法然后还只实现了一个,怕忘了所以想着开个新坑记录下qwq 然后先放下传送门QAQ(哦这题和supermarket,双倍经验qwq 第一个是贪心+单调队列,和蔬菜&supermarket这两题都挺像的一个想法,就是能往后安排往后安排,因此就先按时间排序然后用个priority_queue就过去辽 第二个是也是贪心但是也许复杂度好看些?不清楚诶QAQ就是用个并查集合并日期,就有点像那个,疯狂的馒头?好了没了,over…
题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零): 3.多测不清空,爆零两行泪: #include <bits/stdc++.h> #pragma GCC optmize(2) using namespace std; int t; int n,m; struct littlestar{ int to; int nxt; int w; }st…
题面 利用暴力快速幂O(nlogn)会TLE掉: 所以对于求1~n的所有逆元要用递推公式: #include <bits/stdc++.h> using namespace std; ]; int main () { int n,p; cin>>n>>p; inv[]=; cout<<inv[]<<endl; ;i<=n;i++){ inv[i]=(p-p/i)*inv[p%i]%p; printf("%lld\n",i…
题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a  和 b  的质因数都是 n 的质因数 对于 n  的每个质因数 x ,在 n 中的次数为 y ,那么 x  在 a 和 b  中至少有一个次数为 y,在另一个中的次数 <=y. 所以我们只要把 n 的每个质因数的次数求出来就好了 即ans=(2a1+1)×(2a2+1)×……×(2an+1). #include <iostream> #include <cmath> #prag…
题面 思路一:纯模拟.(暴力不是满分) 思路: 1.定义一个二维数组. 2.根据每个数据给二维数组赋值. 3.最后输出那个坐标的值. 思路二(正规思路): 逆序找,因为后来的地毯会覆盖之前的,一发现有解就输出…
吐槽一下:蜜汁UKE是什么玩意?! 题目分析: 观察题面,对于给定的组卷要求,计算满足要求的组卷方案,可以发现这是一道明显的有条件的二分图匹配问题,于是考虑建模. 建一个超级源点,一个超级汇点:源点与试题相连,汇点与类型相连. 重点是类型的题数的建模.可以从感性来理解一下,其实这有一点限流的意思,每个类型只要求有这么多的题量,不能超出,于是考虑在类型与汇点相连的时候将容量设为类型的题数,在算最大流的时候将题量限制住,就能满足题面的要求了.(希望大家能明白我的意思 \(QwQ\) ) 最后的图即为…
我在这里就讲两种方法 Prim 和 Kruscal Kruscal kruscal的本质其实是 排序+并查集 ,是生成树中避圈法的推广 算法原理如下 (1)将连通带权图G=<n,m>的各条边按从小到大的次序排列,写成E1,E2,···Em,其中E1的权最小,Em的权最大,m为边数.//这就是排序的原因 (2)取权最小的两条边E1,E2,构成边的集合T,即T={E1,E2}.从E3起,按次序逐个将边加进集合T中去,若出现回路则将这条边排除(不加进去),按此法一直进行到Em,最后得到n-1条边的集…
我先讲一下我的思路 将A,B,C,D四种操作用函数储存起来: 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABCD共19种情况:(这里面一定有遗漏的点,但由于数据太水,所以没有一一列出来) 对初始矩阵进行上面枚举的操作,如果操作后与最终矩阵相同,便直接输出所对应的枚举的操作: 如果此时还没有结束程序(即所有操作都枚举完之后,皆不符合最终矩阵),就直接输出"Poland cannot into space!!!…
吐槽: 只能说这道题很数学,本数学蒟蒻推了半天没推出来,只知道要用绝对值,幸亏教练提醒,才勉强想出正解(似乎不是这样的),真的是很无语. 以上皆为吐槽本题,可直接 跳过 分析: 既然题目是要使书架上的书一样多,那么就一定要求平均数了 \(s=\sum_{i=1}^n book_i,s=s\div n\),\(s\)即为平均数 继续分析,我们将平均数减掉,得出一个书架需要改变的量\(x_1,x_2,\)···\(x_n\),这时我们发现,我们可以得出一个方程组 \(\begin{cases}x_1…
前言: 其实这道题挺水的,但我居然把ta想成了 贪心 啪啪打脸 好了,废话不多说. 思路: step 1:先翻译以下题意,其实就是求出最多消耗多少体力能把东海填满,如果不能填满,就输出"Impossible" step 2:于是想到 贪心 01背包,以搬石头消耗的体力为物品的体积,以石头的 step 3:我们现在已经求出(1~c)所有体力可搬走的最大的体积,假如此时以i体力可填满东海,消耗的体力就是(c-i):如果以c的体力都不能填满,就输出"Impossible"…
给出一种主函数递归的方法(其实主函数 main() 也是可以递归的) #include <stdio.h> int main() { int a; scanf("%d", &a); if (a != 42) { printf("%d\n", a); main(); } return 0; }…
目测 普及/提高- 难度. 思路 将 9 种可能的等级存储在数组里,则 min 值为分数为 0 ~ 3199 的颜色种类个数,max 值为 min 值加上分数 >3200 的人数. 特判 若分数为 0 ~ 3199 的颜色种类个数为 0,分数 >3200 的人数大于 1,则min 值为 1,max 值为分数 >3200 的人数 代码 #include <stdio.h> int getBlock(int rating) { if (rating < 400) retur…
题目 这道题让我们求最小限重的最大值 显然可以先求出最大生成树,然后在树上进行操作 因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的 然后考虑求最小权值 可以采用倍增求LCA,预处理时顺便把最小权值求出来 Code: #include<bits/stdc++.h> #define IO4 10000+10 #define debug cout<<"Error"<<endl using namespace std; int n,…
这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i个人,一号时间j,用前缀和维护时间,s[i]-j就是二号的时间 Code: #include<bits/stdc++.h> using namespace std; struct Person { int take,eat; bool operator < (Person ano)const…
我不是题目的说 这道题运用了一种很巧妙的DP方式:悬线法 如图,蓝色为悬线,黄色为向两边延伸的长度 那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略) 所以我们可以维护三个数组: Up[i][j]表示向上延伸的长度 Left[i][j]表示向左能延伸到的最远横坐标 Right[i][j]表示向右能延伸到的最远横坐标 Code: #include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int n,m,maxR…