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. navigationItem的设置和titleView的设置

    设置导航栏中间的标题 self.navigationItem.title = @"title"; 设置导航栏的主题颜色 self.navigationBar.barTintColo ...

  2. mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表

    注意点: (1)进行拆分的总表表名是不同的.所以创建暂时表,把总表的数据先插入暂时表 (2)为了避免最外层游标轮询数据结束时,抛出 not found 退出程序,不会运行关闭游标等兴许操作,定义con ...

  3. mysql热备及查询mysql操作日志

    mysql热备 1 查看mysql版本,保证主库低于等于从库 2 主库配置:   A 需要打开支持日志功能:log-bin=mysql-bin   B 提供server-id:server-id=1  ...

  4. 重启nginx后丢失nginx.pid的解决方法(转)

    一,nginx的停止操作 停止操作是通过向nginx进程发送信号来实现的.步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编号就是主进程 ...

  5. HTML基础知识总结一

    一.HTML是什么? HTML是超文本标记语言的英文缩写,"超文本"就是指页面内能够包括图片.链接.甚至音乐.程序等非文字元素.超文本标记语言的结构包括"头"部 ...

  6. Java自动内存管理机制

    1.运行时数据区域划分 2.程序计数器 作用:可以看做是当前线程所执行的字节码的行号指示器. 解释:字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令.分支,循环等 基础功能就是依赖程序 ...

  7. Android实用工具

    1 json类:hiJson 格式化json字符串 2 sqlite类:sqlitespy,SQLiteExpertSetup 3

  8. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  9. 类中的internal成员可能是一种坏味道

    前言 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联 ...

  10. FormatFloat

    http://www.delphibasics.co.uk/RTL.asp?Name=FormatFloat 1  function FormatFloat ( const Formatting : ...