【bzoj1597- [Usaco2008 Mar]土地购买】斜率优化

本文介绍了一种使用斜率优化技术解决土地购买问题的方法。通过合理的分组策略,使得购买多块土地的成本降至最低。文章详细阐述了如何通过排序和去除无用矩形来简化问题,并给出了具体的实现代码。

【bzoj1597- [Usaco2008 Mar]土地购买】斜率优化

597[Usaco2008 Mar]土地购买

【题目描述】

N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= <= 1,000,000; 1 <= <= 1,000,000). 每块土地的价格是它的面积,FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3×5的地和一块5×3的地,则他需要付5×5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费。

【输入格式】

1: 一个数: N

2..N+1: i+1行包含两个数,分别为第i块土地的长和宽。

【输出格式】

求最小的可行费用。

Sample Input

4

100 1

15 15

20 5

1 100

Sample Output

500

HINT

FJ3组买这些土地: 第一组:100×1, 第二组1×100, 第三组20×5 15×15 plot. 每组的价格分别为100,100,300, 总共500

 

给定一些矩形,分组购买,一组的价格是其中最大的长*最大的宽。

n<=50000

 

一开始并没有思路。。。

 

首先,我们考虑没有贡献的矩形——对于x,如果存在a[y]>=a[x] && b[y]>=b[x],则x是无用的。排序去掉。

排序就先按x排序大到小,再按y排序大到小。

出现排序后x,y,z矩形,x能不能套y但能套z的话,那y也能套z,是不会错的。。 

最后一定是a递减,b递增。


so:

f[i]=f[j]+a[j+1]*b[i]

然后用斜率优化。

这个是把除法改成乘法的。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<queue>
 8 using namespace std;
 9 
10 typedef long long LL;
11 const int N=50010;
12 int n,pl,Q[N];
13 LL l=0,r=0,ai,xj,bj,j,f[N];
14 struct node{
15     LL a,b;
16     bool bk;
17 }p[N];
18 
19 // f[i]=f[j]+a[j+1]*b[i]
20 // ai=b[i]
21 // xj=a[j+1]
22 // bj=f[j]
23 
24 LL XX(int i,int j){return p[i+1].a-p[j+1].a;}
25 LL YY(int i,int j){return f[i]-f[j];}
26 double X(int i){return p[i+1].a;}
27 double Y(int i){return f[i];}
28 double find_k(int i,int j){return (Y(i)-Y(j))/(X(i)-X(j));}
29 
30 bool cmp(node x,node y){
31     if(x.a!=y.a) return x.a>y.a;
32     return x.b>y.b;
33 }
34 
35 bool judge_1()
36 {
37     LL tx=XX(Q[l],Q[l+1]),ty=YY(Q[l],Q[l+1]);
38     if(tx>=0) return ty>=((-ai)*tx);
39     return ty<=((-ai)*tx);
40 }
41 
42 bool judge_2(int i)
43 {
44     LL t0=YY(Q[r],Q[r-1]),t1=XX(Q[r],Q[r-1]),t2=YY(i,Q[r]),t3=XX(i,Q[r]);
45     if(t1<0) t0=-t0,t1=-t1;
46     if(t3<0) t2=-t2,t3=-t3;
47     return (t0*t3)<(t1*t2);
48 }
49 
50 int main()
51 {
52     freopen("a.in","r",stdin);
53     // freopen("acquire.in","r",stdin);
54     // freopen("acquire.out","w",stdout);
55     scanf("%d",&n);
56     for(int i=1;i<=n;i++) 
57     {
58         scanf("%lld%lld",&p[i].a,&p[i].b);
59         p[i].bk=1;
60     }
61     sort(p+1,p+1+n,cmp);
62     j=1;
63     for(int i=2;i<=n;i++)
64     {
65         if(p[i].a<=p[j].a && p[i].b<=p[j].b) p[i].bk=0;
66         else j=i;
67     }
68     pl=1;
69     for(int i=2;i<=n;i++)
70         if(p[i].bk) p[++pl]=p[i];
71 
72     for(int i=1;i<=pl;i++)
73     {
74         ai=p[i].b;
75         while(l<r && judge_1()) l++;/*find_k(Q[l],Q[l+1])>=(-ai)*/
76         j=Q[l];
77         xj=p[j+1].a;
78         bj=f[j];
79         f[i]=ai*xj+bj;
80         while(l<r && judge_2(i)) r--;/*find_k(Q[r],Q[r-1])<find_k(i,Q[r])*/
81         Q[++r]=i;
82     }
83     printf("%lld\n",f[pl]);
84     return 0;
85 }

 

posted @ 2016-09-20 21:35 拦路雨偏似雪花 阅读( ...) 评论( ...) 编辑 收藏
一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值