摘要:
UVA_11100 首先,pieces的数目是取决于出现的次数最多的数的,出现次数最多的数的出现次数就是pieces的数目。 剩下还要保证每个pieces里面盒子数的最大值要尽量小,那么可以直接将盒子按大小排序,然后将每个盒子按1,2,...,n,1,2,...n...的顺序依次放到每个piece中,就可以构造出一个符合题意的放置方案了,其中n表示pieces的数目。#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#define MAXN 10010int 阅读全文
摘要:
UVA_11134 实际上行和列是独立的,也就是说不会因为rook行位置的不同而影响其列位置上的摆放,反之亦然。 那么我们不妨先将行号分配给各个rook,再将列号分配给各个rook。 单就分配行号而言,我们可以枚举1-N这N个行号,当前这个号码应当分配给可以分配的并且xri最小的那个rook,因为这样至少不会使结果变得更糟,至于对这个贪心的证明就暂且略过了。 这个题目和LA_4254的贪心思路是很像的。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 5010#define 阅读全文
摘要:
UVA_11627 显然sj越小,越容易存在一条路线完成任务,那么我们可以先通过二分找到一个可能的最大的sj,再在所有的滑雪板中挑出一个和这个sj最近接的数即可。 在判断当前sj下能够穿过所有门时,可以自顶向下,逐步约束人能够到达的x坐标上的范围,直到这个范围变成空集或者所有的门都经过了为止。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 100010int W, vh, N;struct Gate{ int x, y;}g[MAXN];void input(){ scan 阅读全文
摘要:
LA_4254 一般最大值最小的问题都可以通过二分来求解,这个题目也不例外。我们对处理器速度进行二分之后,问题就转化成了对于给定的处理速度,问处理器是否可以将这些问题处理完。一个贪心的思路就是每个时刻应该尽量做可以做的任务中,结束时间最早的那个,这样最起码不会使结果更糟。这样就可以枚举每个单位时间,然后去找可以做的并且结束时间最早的那个去做,直到用完这一单位时间或者无任务可做为止。最后如果发现哪个任务还没做完,就说明在这个给定的处理速度下,处理器是不能完成所有任务的。 在查找结束时间最早的可做的任务的过程中,我的代码借助了线段树。不过据AC排名来看,应该还有更简便的算法,只不过我暂时没有想到。 阅读全文