BZOJ1505: [NOI2004]小H的小屋

Description

小H发誓要做21世纪最伟大的数学家。他认为,做数学家与做歌星一样,第一步要作好包装,不然本事再大也推不出去。

为此他决定先在自己的住所上下功夫,让人一看就知道里面住着一个“未来的大数学家”。

为了描述方便,我们以向东为x轴正方向,向北为y轴正方向,建立平面直角坐标系。

小H的小屋东西长为100Hil(Hil是小H自己使用的长度单位,至于怎样折合成“m”,谁也不知道)。

东墙和西墙均平行于y轴,北墙和南墙分别是斜率为k1和k2的直线,k1和k2为正实数。

北墙和南墙的墙角处有很多块草坪,每块草坪都是一个矩形,矩形的每条边都平行于坐标轴。

相邻两块草坪的接触点恰好在墙上,接触点的横坐标被称为它所在墙的“分点”,这些分点必须是1到99的整数。

小H认为,对称与不对称性的结合才能充分体现“数学美”。

因此,在北墙角要有m块草坪,在南墙角要有n块草坪,并约定m≤n。

如果记北墙和南墙的分点集合分别为X1,X2,则应满足X1 X2,即北墙的任何一个分点一定是南墙的分点。

由于小H目前还没有丰厚的收入,他必须把草坪的造价降到最低,即草坪的占地总面积最小。

你能编程帮他解决这个难题吗?

Input

仅一行,包含4个数k1,k2,m,n。k1和k2为正实数,分别表示北墙和南墙的斜率,精确到小数点后第一位。

m和n为正整数,分别表示北墙角和南墙角的草坪的块数。

Output

一个实数,表示草坪的最小占地总面积。精确到小数点后第一位。

2≤m≤n≤100 南北墙距离很远,不会出现南墙草坪和北墙草坪重叠的情况

Sample Input

0.5 0.2 2 4

Sample Output

3000.0

HINT


题解Here!

考试的题,然后模拟退火成功弄到了$90$分。
不过当然是对着测试数据一次一次滴调玄学参数弄成的。。。
然后$DP$正解被集体$hack$了。。。
主要看的是这个巨佬的题解:链接
$\#1:\quad\text{DP+优化}$:(未填坑。。)
$\#2:\quad\text{贪心}$:
我们知道,对于一块长度一定的矩形,将其均分,一定能得到最小面积的矩形分割方案。
证明?如下:
假设当前这个矩形长度为$4x$,并且矩形对角线斜率为$k$。
再假设我们当前要分成两个矩形,那么有两种分法:$x,3x$与$2x,2x$。
显然$$S_1=kx^2+9kx^2=10kx^2>S_2=4x^2+4x^2=8x^2$$
然后分$3,4,5,...$块时依次类推。
于是得证。
当然还可以用不等式证明,比这个更严谨,不过为了通俗易懂我就这么做了。
然后就可以贪心了。

当$n \% m==0$时,直接均分南北墙就是最优值。

而当$n \% m>0$时,应该使其余数尽量均分在每一段上。

所以此时整个图形可以分为$2$段:
前段有$m-n \% m$块北墙草坪,每段对应$\lfloor\frac{n}{m}\rfloor$块南墙草坪;
后段有$n \% m$块北墙草坪,每段对应$\lfloor\frac{n}{m}\rfloor+1$块南墙草坪。
所以可以枚举两段长度,取最小面积。
并且对于其中一段,其分配的面积也应该平均分配,如果余数不为$0$,也要把余数再平均分配。
然后,我们发现:枚举的长度对应的面积是单峰的!
所以当发现一个长度对应的面积大于当前最优解就可以直接跳出循环输出答案了。
然后就做完了。
时间复杂度$O(100)$,跑的飞快!
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<ctime>
#define MAXN 110
#define eps (1e-8)
using namespace std;
int n,m,lnorth,rnorth,lsouth,rsouth;
double k1,k2,ans=(1LL<<62);
inline double square(int x){return 1.00*x*x;}
inline double min(double x,double y){return x<y?x:y;}
inline double Area(int num,int len,double k){
if(!num)return 0;
double s=square(len/num)*k*(num-len%num)+square(len/num+1)*k*(len%num);
return s;
}
void work(){
if(n%m==0){
ans=Area(lnorth,100,k1)+Area(lnorth*lsouth,100,k2);
printf("%.1lf\n",ans);
return;
}
for(int i=lnorth*lsouth;i<=100-rnorth*rsouth;i++){
double area=Area(lnorth,i,k1)+Area(rnorth,100-i,k1)+Area(lnorth*lsouth,i,k2)+Area(rnorth*rsouth,100-i,k2);
if(ans>area)ans=area;
else break;
}
printf("%.1lf\n",ans);
}
void init(){
scanf("%lf%lf%d%d",&k1,&k2,&m,&n);
lnorth=m-n%m;rnorth=n%m;
lsouth=n/m;rsouth=n/m+1;
}
int main(){
init();
work();
return 0;
}
 

BZOJ1505: [NOI2004]小H的小屋的更多相关文章

  1. [NOI2004]小H的小屋 贪心

    神仙贪心,洛谷没有插图导致我题一开始都没看懂.容易发现,块越多越优秀,然后为了满足题意,所以假如不能整除,就分为两个部分(能整除就直接均分就行了).前一部分是n/m,后一部分是n/m+1.数量也是固定 ...

  2. P4274 [NOI2004]小H的小屋 dp 贪心

    LINK:小H的小屋 尽管有论文 但是 其证明非常的不严谨 结尾甚至还是大胆猜测等字样... 先说贪心:容易发现m|n的时候此时均分两个地方就是最优的. 关于这个证明显然m在均分的时候的分点一定是n的 ...

  3. NOI2004 小H的小屋

    还是纯粹不会啊……到底该怎么办 http://blog.sina.com.cn/s/blog_86942b1401016m3g.html http://www.cnblogs.com/datam-cy ...

  4. hihocoder 1347 小h的树上的朋友

    传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...

  5. 【渗透笔记】拿下某小H网的全过程

    自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...

  6. 一个简洁的小H车调运模型

    一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用 ...

  7. 小H和密码

    链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1 ...

  8. 【Wannafly挑战赛10 - B】小H和密码(DP)

    试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每 ...

  9. hihocoder-1347 小h的树上的朋友(lca+线段树)

    题目链接: 小h的树上的朋友 时间限制:18000ms 单点时限:2000ms 内存限制:512MB 描述 小h拥有n位朋友.每位朋友拥有一个数值Vi代表他与小h的亲密度.亲密度有可能发生变化. 岁月 ...

随机推荐

  1. hdu 5012 bfs --- 慎用STL 比方MAP判重

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 假设Sting s = '1'+'2'+'3'; s!="123"!!! ...

  2. Tomcat 编码不一致导致乱码

    众所周知,Tomcat是一个基于HTTP协议的Java应用服务器(非Web服务器),也是一个Servlet容器. 一般我们会基于使用HTTP协议的Post或Get方法来传递内容或参数,中间会涉及一些编 ...

  3. ASP.NET MVC生成安全验证码

    html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. 最新iOS发布App Store详细图文教程~

    网上有很多关于iOS发布上架的教程,但大多比较旧而且不完整.不够清晰.所以整理了一个详细完整的iOS APP发布上架App Store的图文教程.分享给小白到大神路上前进的你我. 上架iOS需要一个苹 ...

  5. GROUP BY和HAVING 以及mysql中常用的日期函数

    一.mysql中的GROUP BY和HAVINGGROUP BY常见的是和聚合函数(SUM,MIN,MAX,COUNT)搭配使用. 比如:SELECT category,SUM(money) AS ` ...

  6. 最小化JavaScript代码

    1.去除不必要的格式符.空白符.凝视符. 这个操作.事实上能够理解为是一种格式化.尽管它操作的结果事实上是去除掉原始文件的那些格式. 2.模糊(Obfuscation)处理JAVASCRIP脚本源码. ...

  7. STL学习笔记(已序区间算法)

    针对已序区间执行的算法,执行前提是源区间必须在某个排序准则下已序. 搜寻元素(Searching) 1.检查某个元素是否存在 bool binary_search(ForwardIterator be ...

  8. 【HTML5】用脚本控制交互元素details元素的使用

    1.源码 <!. Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo ...

  9. oracle 序列重置

    问题一:怎样重置oracle序列 oracle序列创建以后,假设想重置序列从 0 開始,逐渐递增1,能够採用例如以下存储过程: create or replace procedure reset_se ...

  10. hdu 2871 Memory Control(线段树)

    题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...