白书习题
fwm_94
这个作者很懒,什么都没留下…
展开
-
UVALive 2757 Supermarket(贪心)
首先一定要写成while(scanf("%d",&n)==1),写成while(scanf("%d",&n)!=EOF)会一直TLE。。。 做法就是贪心,先按时间排序,对于每一个任务,不管其结束时间是多少,我们一定从0时刻开始一秒接着一秒的做任务最优。我们用一个变量cur维护当前任务已经做到了哪一秒。如果p[i].d=cur的时候呢?我们就选出之前做过的任务中收益最小的那个,看看替换一原创 2014-02-26 00:50:58 · 627 阅读 · 0 评论 -
UVALive 4726 Average 单调队列+斜率优化
具体的解法请参看《浅谈数形结合思想在信息学竞赛中的应用》。本题中使用叉积可以避免所有浮点运算。#include#define maxn 100009#define LL long longusing namespace std;LL Cross(LL xa,LL ya,LL xb,LL yb)//向量(xa,xb)和向量(ya,yb)求叉积,通过叉积正负判断斜率关系{ ret原创 2014-03-03 01:26:41 · 692 阅读 · 0 评论 -
UVALive 2689 极大子正方形
本题思路详见论文《浅谈用极大化思想解决最大子矩形问题》的算法一,我们的子正方形一定在子矩形的内部,且边长为矩形长宽的一个较小值。#include#include#define maxn 109using namespace std;int ansl,ansx,ansy;struct node{ int x,y; bool operator<(const node &原创 2014-03-04 00:15:15 · 530 阅读 · 0 评论 -
UVA 10970 Big Chocolate(暴力,找规律)
给你一块n*m的巧克力,现在要把它切成n*m个小块,每刀只能沿着一条直线把一块巧克力切成两部分,问你最少切几刀? 先想想暴力的方法,我们可以用dp[i][j]表示把一块i*j的巧克力切开最少需要几刀,注意到dp[i][j]=dp[j][i],所以我们只需要处理idp[i][j]=min(dp[x][j]+dp[y][j])+1其中x+y=i。dp[i][j]=min(dp[i][原创 2014-02-20 00:24:00 · 620 阅读 · 0 评论