BZOJ 2288 贪心 +链表】的更多相关文章

思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #include <cstdio> #include <algorithm> using namespace std; ; int a[N],s[N],top,n,m,add,minu,tot,next[N],pre[N],vis[N]; struct Node{int v,id;Node(){…
好像是模拟费用流 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define P pair<int,int> #define ll long long #define maxn 100007 using namespace std; int arr[maxn],l[maxn],r[maxn],mark[maxn]; priority_que…
题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. 我们使用一种神奇的贪心,开始的时候将所有的点权加入堆中,然后取 k 次,每次取权值最小的点,然后将这个点的点权加入答案中,我们取了这个点之后就不能取与它相邻的两个点了,所以我们要将这个点和相邻两点的权值都从堆中删除.但是我们最终的答案并不一定要取这个点,有可能我们会不取这个点,而是取与它相邻的两个点…
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][Status][Discuss] Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗?   Inp…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2288 [题目大意] 给出一列数,求最多取m段连续的数字,使得总和最大 [题解] 首先我们对数据进行合并处理,连续的一段正数或者连续的一段负数处理成一个数字, 之后我们发现,如果正数的个数小于等于m,那么直接输出正数的总和即可, 如果大于m,我们有些正数不选,或者选择一些负数把左右两端的正数并起来. 这个负数的选择过程相当于减去这个数的绝对值, 正数选择拿出去的过程也相当于减去这个数的…
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Input 第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分. 第2行, N 个整数 A1, A2, ..., AN (0…
就是堆+链表,十分像 数据备份 对吧? 把相邻的正数和相邻的负数合并成一整个正数块和负数块,最后只剩一些交替相间的正块与负块了吧? 显然,正块的个数<=m时,全部选走就获得了最大权值,否则我们可能需要选一些负块来获得最优解. 然而弱不经风的我调了四个小时链表和预处理QAQ... 千万不要犯此种错误: n=g(),m=g(); ;i<=n;++i) a[i]=g(); vl[cnt]=a[],pre[]=; ;i<=n;++i) ])&&sgn(a[i])) vl[cnt]…
参考:http://blog.csdn.net/w_yqts/article/details/76037315 把相同符号的连续数字加起来,合并后ans先贪心的加上所有正数,如果正数个数sum>m,设计二元组(i,a[i])表示合并后序列i位置上值为a,记录前驱后继,塞进按绝对值排序的小根堆里.每次拿出来一个,减去这个x的a的绝对值,然后合并左右前驱后继,再塞回去. 如果拿出来的是正数,那么减去相当于原来选了现在不选,如果是负数,减去相当于选. 然后a值要改成a[l]+a[r]+a[x],下次再…
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2521    Accepted Submission(s): 986 Problem Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the genie…
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1003  Solved: 317[Submit][Status][Discuss] Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Inpu…
题目大意:有n个点,k条链,每个点离原点有一定的距离.要你用k条链连接2k个点,使得k条链的长度最短. 首先每次肯定是链相邻的2个点,所以我们先把相邻2个点的差值求出来,得到有n-1个数的数列. 然后问题就变成“在这个数列中寻找k个互不相邻的点,使得它们的和最小”. 我们把所有的数扔进一个堆里,每次贪心找出最小的数,在答案里把它加上. 这时就会出现一个问题:假设我们贪心出了第i个数,那么有可能选第i-1个数和第i+1个数最终的结果优于选第i个数. 所以我们每次贪心时,把找到的那个数的前一个数和后…
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 856  Solved: 260[Submit][Status][Discuss] Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗?   Inp…
如果两点的曼哈顿距离在一定范围内时我们直接暴力搜索就可以得到答案,那么开始贪心的跳,判断两点横纵坐标的差值,差值大的方向条2,小的条1,不断做,直到曼哈顿距离较小时可以暴力求解. 备注:开始想的是确定一点周围跳到这个点的答案,然后再枚举周围的点,判断这个点和另一个点的曼哈顿距离,如果能被3整除就说明之前可以一直跳过来,不知道怎么不对. /************************************************************** Problem: 1193 Use…
就贪心就行了,首先可以看成n个格子,放物品,那么 一个物品假设放3个,放在1,k,n处,那么价值和放在1,n 是一样的,所以一个物品只放两个就行了,价值大的应该尽量放 在两边,那么排序之后模拟就行了 /************************************************************** Problem: User: BLADEVIL Language: Pascal Result: Accepted Time: ms Memory: kb ********…
我们可以贪心的分析,每个点的入度如果是0,那么这个点不可能 被用来更新答案,那么我们每次找入度为0的点,将他去掉,如果他连的 点没有被更新过答案,那么更新答案,去掉该点,环的时候最后处理就行了 /**************************************************************     Problem:     User: BLADEVIL     Language: Pascal     Result: Accepted     Time: ms   …
题目链接:https://codeforces.com/problemset/problem/1136/D 题意: 给出 $1 \sim n$ 的某个排列 $p$,再给出若干 $(x,y)$ 表示当序列中出现 $x,y$ 时,两者可以交换位置.问序列中最末尾的数可以前进多少步. 题解: 如果 $p[n-1]$ 可以与 $p[n]$ 交换位置,那么肯定是立刻交换,因为首先 $p[n-1]$ 只能最多只能产生 $1$ 步的贡献,同时就算把 $p[n-1]$ 往前换,等到在未来某个时刻再跟 $p[n]…
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品按s排序就可以直接判断后一项. 我们发现当要判断的区间的长度\(\leq m\)时,区间内的所有数都要选(后一项都确定了). 当区间长度\(>m\)时,自然是选\(v\)最大的\(m\)个.可以用链表把\(v\)最小的逐个删去. 发现删掉\(x\)的话我们只需要用\(x\)附近\(m\)个数更新答案…
1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2015  Solved: 914[Submit][Status][Discuss] Description 在国际象棋和中国象棋中,马的移动规则相同,都是走“日”字,我们将这种移动方式称为马步移动.如图所示, 从标号为 0 的点出发,可以经过一步马步移动达到标号为 1 的点,经过两步马步移动达到标号为 2 的点.任给 平面上的两点 p 和 s ,它们的坐标分…
思路:这个贪心排顺序我居然没看出来. 吃饭时间长的在前面, 用反证法很容易得出. 剩下的就是瞎dp啦. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define PLI pair<LL, int> #define ull unsigned long long…
题目传送门:这里是萌萌哒传送门(>,<) 啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法. 思路很简单,假设我指定了一个x,要求通过调整,所有的成绩都最迟在第x天出. 调整到第x天的代价是很容易通过贪心计算出来的啦,复杂度线性. 然后我们考虑从大到小枚举x,每次计算出代价之后更新答案. 再然后我们大胆猜想这是一个单峰函数! 既然都单峰啦那直接三分就好啦(>,<). 实际上我不知道它是不是真的是单峰函数...但是就AC了…
贪心的一种,维护一种尽可能优的状态(即不会比最优解差),将这种状态保持到最后. /************************************************************** Problem: 1029 User: idy002 Language: C++ Result: Accepted Time:400 ms Memory:2368 kb *************************************************************…
首先如果我们想取得分最高的话,肯定尽量赢,实在赢不了的话就耗掉对方最高的,那么就有了贪心策略,先排序,我方最弱的马和敌方最弱的相比,高的话赢掉,否则耗掉敌方最高的马. 对于一场比赛,总分是一定的,所以两问实际上是等效的. /************************************************************** Problem: 1034 User: BLADEVIL Language: C++ Result: Accepted Time:264 ms Mem…
设根到每个叶子节点的距离为dis,比较容易的看出来,我们需要把这颗树的所有叶子节点的值都变成其中最大的内个,我们设为max,那么对于一颗子树来说,设其中dis值最大的为x,我们需要将这个子树根节点和子树根节点的父亲节点的边的值增加max-x,这时从贪心的角度来考虑,因为不论如何,对于当前最大的这个点来说,我们都需要将他的值增加max-x,那么我们只需要让这增加的更有价值,也就是使更多需要增加的点都被增加些,那么因为不能加多,所以取得是最大的点的dis值.那么dfs一遍就行了. 反思:过程中申请变…
首先选取的线段一定是相邻两个端点线段,那么我们贪心的考虑这个问题,我们先在这n-1条线段中选出最短的一条,然后将这条线段的值改为左面的线段的值+右面的线段的值-自己的值,用这条线段取代原来这三条线段,继续做,那么这个取m次出来之后的就是答案,对于证明,我们可以大概的去想,选了新的线段代表不选这条原本的线段,然后选另两条相邻的线段,这样选的线段的条数只是+1,相当于又取了一条线段,正确性的证明可以大概感知. 至于选最小的用堆来维护就行了,因为需要删除精确到点编号,对堆用的不熟悉,所以用sbt代替.…
首先我们可以将这道题看成一个数轴,数轴其中的某些点存在一些颜色,我们要选取最短的一段,使这段存 在所有颜色,那么我们使用指针i,j表示在j-i位置中包含的颜色,那么初值是0,0,我们先i++,同时添加i位置 的颜色,直到j-i中存在所有颜色,然后j++,同时删除颜色,直到不存在所有颜色,然后更新答案,重复这过程, 因为i,j只增不减,所以是o(n)的,但是要离散化,还是nlogn的,也算是贪心吧 /*************************************************…
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1044 首先对于第一问,我们可以轻易的用二分答案来搞定,对于每一个二分到的mid值 我们从len[i]开始累加,每到累加值>mid的时候,就累加一个需要砍的次数,然后 比较次数和m的大小关系,然后二分就行了,这里有个小贪心,对于一个len[i],我们 尽量的不让他消耗一次砍得次数,直到非砍不可了才砍. 那么问题就转化成了我们有N个木条的长度,用最多M刀将他们分为不超过ans长度的方案数 我…
BZOJ2563阿狸和桃子的游戏   2563: 阿狸和桃子的游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 682[Submit][Status][Discuss] Description 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的: 1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色.已经被染过色的点不能…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2288 [算法] 先将这个序列的正负数合并起来,变成一个正负交替的序列 如果新序列的正数个数小于等于M,那么直接输出正数的和即可 否则,我们可以将某些正数和负数合并起来,或者不要某些正数 将所有数按绝对值排序,放入堆中,问题就转化为了 : 在这些数中选出(Cnt - M)个数(其中Cnt为正数的个数), 选了一个数后相邻的两个数就不能选,使得最后的和尽可能小 这个问题可以用CTSC2…
思路: 显然是个贪心 排个序 然后扫几遍就好了 (重叠的区间不能取) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int ans,n,k,a[50050],rec[50050],maxx[50050]; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++)scanf("%…
题面 若一个大于 11 的整数 M的质因数分解有 k 项,其最大的质因子为 \(a_k\),并且满足 \({a_k}^k \leq N,k<128\),我们就称整数 M 为 N-伪光滑数. 现在给出 N*N,求所有整数中,第 K大的 N-伪光滑数. 分析 先筛出128以内的所有质数 根据题意贪心考虑,显然M的质因数分解中最大的质数越大越好 于是我们把每个质数p的1次方,2次方,3次方...k次方(\(p^k \leq n\))加入堆(堆顶元素最大). 然后取k-1次,每次对于取出来的数x,除掉它…