uva 1422 - Processor(二分+优先队列)】的更多相关文章

题目链接:uva 1422 - Processor 题目大意:有一个机器要处理一些问题,给出这些问题可以开始的时间和必须完成的时间,以及任务的工作量,问说机器必须以最少每秒多少得工作量才能完成这些任务. 解题思路:二分答案,答案的上限是MaxWork * MaxN(全在一秒内完成).然后就是判断说在c的工作量小是否能完成任务.因为处理一个问题的时间可以不连续,所以给解题增加了难度. 现将任务按照开始的时间从小到大排序,然后枚举时间区间.开始时间比当前枚举时间小的话入队. 队列用优先队列,结束时间…
题意:有n个任务,每个任务有三个参数,r,d,w,表示该任务必须在[r,d]之间执行,工作量是w,处理器执行速度可以变化,当执行速度是s的时候, 一个工作量是w的任务需要需要的执行时间是w/s个工作单位,另外,任务不一定要连续的执行,可以分成若干块,求出处理器执行过程中最大速度的最小值, 速度必须是整数. 析:首先是二分这个速度,然后去判断是不是成立,判断的时候要用到优先队列,把把所有的任务按开始时间排序,然后去枚举每个时间点, 用优先队列去维护一个结束时间早的优先,在每个时间点判断是不是能完成…
UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且1为丑数,那么不妨从1开始算起.算完之后2,3,5均为丑数,然后再从2算起,4,5,10均为丑数--直到算到第1500个即可.那么有如下的问题: 如何从算出来的丑数中取出最小的? 如何保证没有计算重复的丑数? 对于第一个问题,可以采用优先队列的方法,即有序的队列,且为升序,每次只需要取出队首元素即可…
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2255 题意 n个任务,允许时间区间为[ri, di](ri , di <= 20000),运算量为wi,可以分割,问最小运算速度 思路 明显,应该二分枚举最小运算速度, 对于时刻i来说,应该优先处理已经开始的最早结束的任务.接着,如果任务已经处理完毕,那就应该等待…
题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免小数问题),然后贪心考虑每次处理最早结束的工作即可.注意我这里的代码t表示的是一整秒,譬如[1,2]即t=1. 具体见代码: #include <stdio.h> #include <algorithm> #include <string.h> #include <q…
题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇佣. 然后给你一个金钱总额, 让你在最短的时间的修复这些bugs, 并且给出每个bug是由谁修复的, 一个人一天只能修复一个bug. 首先, 对bug的复杂度由高到低排序, 对人的能力值由高到低排序. 这时候需要二分修复的时间, 假设需要的时间是t, 那么显然, 一个人一共可以修复t个bug, 因为有t天…
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2674 题意 有严格下降的n条线段,长度都为w,第i条线段起点xi,终点xi + w,高度yi,现在有s种垂直恒定速度可以选择,水平速度不能超过vh,问要经过每条线段,垂直恒定速度最大可以选择什么 思路 明显,二分枚举速度speed 第一条线段因为是起点所以肯定都能到达 对于第i条线段…
题意:有n个点,标号为点1到点n,每条路有两个属性,一个是经过经过这条路要的时间,一个是这条可以承受的容量.现在给出n个点,m条边,时间t:需要求在时间t的范围内,从点1到点n可以承受的最大容量........ 思路:其实我是觉得思路挺简单的,就是二分枚举每条边的容量,然后再看在这个容量的限制下,是否可以从点1到点n........ 方法1:二分枚举边的容量,然后一次dfs,判断在容量和时间的双重限制下,是否可以从点1到达点n...... wa代码: #include<iostream> #i…
书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最优的移动士兵的方式, 使得与敌方相邻的阵营中最少的士兵最多 因为只能在我方的阵营中移动士兵, 所以建模的时候不用加入地方阵营的点. 首先因为士兵只能移动一次, 所以把点拆成两个点, 入点和出点. 设阵营士兵的人数为k[i] 那么源点到入点连一条弧, 容量为k[i], 然后入点和出点再连 一条弧, 容…
正题 题目链接:https://www.luogu.com.cn/problem/CF802O 题目大意 \(n\)天每条有\(a_i\)和\(b_i\). 每条可以花费\(a_i\)准备至多一道题,可以花费\(b_i\)打印至多一道准备好了的题. 求准备\(k\)道题最少要花费多少. \(1\leq k\leq n\leq 5\times 10^5\) 解题思路 这也能是\(wqs\)二分是我没想到的. 物品可以分成两种,准备题目和打印题目. 然后因为这是个费用流模型所以答案肯定是下凸的. 然…
优先队列. 做法:维护两个优先队列:quesell  和  quebuy, 一个是小值优先,一个是大值优先.每次push的时候,都取各自的Top元素,比较价格,如果卖的比卖的出价低,则成交,各自的要买和要卖的股票数量减少能够减少的最大值,此时的DP(DealPrice)被记录下来. 具体见代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include…
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以选择一个节点v和一个整数d,把所有以v结尾的边权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值大于0且尽量大. 题解: 最小值最大,可以用二分,这样可以得到一个差分约束系统,然后每次都用最短路跑. 代码: #include<iostream> #include<cstd…
题目的本意是求LCS,但由于每个序列的元素各不相同,所以将A序列重新编号{1,2,,,p+1},将B序列重新编号,分别为B中的元素在A中对应出现的位置(没有的话就是0). 在样例中就是A = {1 7 5 4 8 3 9},B = {1 4 3 5 6 2 8 9} 重新编号以后: A = {1 2 3 4 5 6 7}, B = {1 4 6 3 0 0 5 7}(里面的0在求LIS时可以忽略) 这样求A.B的LCS就转变为求B的LIS 求LIS用二分优化,时间复杂度为O(nlogn) 第一次…
思路:设字符串x的长度为n,y的长度为m,那么答案一定在[0, m]之间,那么可以二分求答案. d(i, j)表示第一个串前i个字符至少需要经过多少次才能的到第二个串的前j个字符,转移方程d(i, j) = min{d(i-1, j-1) + is_same(a[i], b[j]), d(i-1, j) + 1, d(i, j-1) + 1}; 如何判断某个答案mid是否合理?当a串中连续k个字符能够在mid次操作类转换成第二个串,就把d(k, 0)变成0即可. AC代码 #include <c…
本来抱着wa一发的心态写写,没想到过了. 算是一种二分吧. 也就是说,减数取太大和太小都不好,怎样是最好的呢?当然是,每次减去一个数之后新形成的序列和前面的序一样是最好的 这样的话,本来想写个二分,但是直接写了下面的代码:开心 #include<iostream> using namespace std; int n, ans, l, r, mid; int main(){ while(cin>>n){ ans=; ;} cout<<ans<<endl; }…
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2075 题意 n皇后类似的n(n<=5000)车,每个车所在的行列上不能有其它车,n*n棋盘放n个车. 现在约束第i个车只能放在[xli, xri], [yli, yri]这样的一个矩形中. 求放的方式. 思路 明显,行列等价且可以分开考虑.题目转化为有n线段,在每个线段内取一点…
http://acm.hdu.edu.cn/showproblem.php?pid=5884 题意:有个屌丝设计了一个程序,每次可以将k个数组进行合并,代价为这k个数组总的长度之和.现在另外一个屌丝要他最后合并成一个数组时的总代价不能超过T.求k的最小值. 思路:贪心策略是长度越小的肯定先进行合并.一开始是直接用一个优先队列,但是这样会TLE的.. 后来改成了用两个队列进行模拟,先将数组排好序然后放入队列之中,每次合并之后的放入另一个队列之中,每次只需要再两个队列之中选择小的即可. #inclu…
题意: 给定一个n个点m条边的加权有向图,求平均权值最小的回路 解析: 首先肯定是想到找出环路  然后..呵..呵..呵呵... 显然不现实!! 二分大法好 ....去猜结果 然后带入验证 ...真是的..很过分! 嗯! 是的! 我参考一下UVA11478的代码 ...建立超级源的做法..竟然50ms  网上的用遍历每个没经过的点的做法2130ms  质的飞跃 ..... #include <iostream> #include <cstdio> #include <sstr…
题意  求把全部数加起来的最小代价  a+b的代价为(a+b) 越先运算的数  要被加的次数越多  所以每次相加的两个数都应该是剩下序列中最小的数  然后结果要放到序列中  也就是优先队列了 #include<cstdio> #include<queue> using namespace std; priority_queue<int, vector<int>, greater<int> >q; typedef long long ll; ll…
这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案.但是因为答案满足单调性, 可以用二分的方法 来"枚举", 复杂度可以从n降到logn 开始我自己写了一个, 但是WA, 后来看了刘汝佳的代码, 发现要注意三点 (1)这道题的和的最大值会爆int, 要用long long. 养成看到题目的时候计算最大值看会不会爆int的习惯(int最大大…
参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久没想出来, 后来看了博客发现因为显然答案是单调的, 可以用二分来做. 看到最大, 最小, 可以考虑答案是否单调, 单调考虑用二分 (2)然后是小数化分数, 其实一开始我想模拟分数, 然后发现很麻烦, 之后博客里的方法技巧性很强. 其实这个方法默认了分母是在1到n之间的, 而好像题目并没有给出这个条件…
Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起点最少须要带多少物品使到达终点时还有k个物品. 当有多条符合条件的路径时输出字典序最小的一个. 思路:已知终点的权值,那么能够从终点向前推. 求终点到起点的最短路径,然后按字典序打印路径. 比較难处理的是:向前推时前驱节点的权值计算.列个方程算算就能够了,主要时不能整除的情况. 计算前驱结点dis值…
题意非常难理解-- #include<cstdio> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 212345; struct node { int a, b, w; }g[MAXN]; int n, m; int output(int k) { REP(i, 1, m + 1) { int a = g[i].a; int b = g[i].b; int…
题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不能互相攻击. 解题思路:因为要保证说每两个车之间不能互相攻击,那么即任意行列都不能摆放两个以上的车,转而言之可以看成是将每一行或列分配给每辆车.如果行和列和起来考虑的话复杂度太高了,但是行和列的分配又互相不影响,所以可以分开讨论. 即对于一个区间[xl,xr],要分配一个x给它,做法和uva 142…
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和B应该都能AC的,但是A题由于脑子二笔了一下,最后终测T掉了.不过很奇怪,最后分数也没有跌,反而涨了,终于要接近紫名了,下一发不跌的话,应该有紫了.然后说一下这场Hihocoder吧,据说有offer面试名额,然后选了网易游戏和微软,虽然很是想去微软的,但是又二笔了几发,这就这样了.. A题:九宫(…
A I Count Two Three I will show you the most popular board game in the Shanghai Ingress Resistance Team. It all started several months ago. We found out the home address of the enlightened agent Icount2three and decided to draw him out. Millions of m…
[参考博客][https://blog.csdn.net/Tawn0000/article/details/82255682] 题意: 将n个数按照每k个一组来合并,合并需要花费的cost是两个数的长度和,问:在T的消费内将所有的数合并所需的最小的k. 分析: 合并之前要处理一下零头,因为每次取k个一直到最后一步剩下的数的个数可能会少于k个,这样的结果就是合并的cost更大了,举个例子:1 2 3 4 5 6,k=4时,先选1 2 3 4然后再5 6 10 是31,但是因为零头有3,先处理3个零…
题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so called scribers. The scriber had b…
UVA 题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径: 思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因为题意是看着博客做的,不小心看到了他的思路,就自己实现了一遍,二分温度,假设当前温度为x,求保证最大温度为x的情况下的最短路:打印路径就是递归打印. #include <iostream> #include <cstdio> #include <cstdlib> #incl…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 题意:有n个有序序列,每个序列有ai个元素,现在有一个程序每次可以归并最多k个序列,最终把所有的序列合并成一个,每次归并所需要的代价是所有序列的长度和: 现有一个代价界限T,就是总的代价不能超过T,求符合条件的最小的K: 当给定一个K的准确值时,我们可以每次选择最小的k个数进行合并:所以我们可以用优先队列来处理,但是由于范围比较大,可以优化一下,只让合并形成的序列进入优先队列,每次取数组和队列…