记录编号 |
119602 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2004]小H的小屋 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.025 s |
提交时间 |
2014-09-13 11:05:34 |
内存使用 |
0.25 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
double K1,K2;
int M,N;//北M南N
double calc_rect(double x,double k){//横向x,斜率k
return x*k*x;
}
double calc_area(int x,int v){//横向长度x,北边1个,南边v个
if(!x) return 0;
int r=x%v;
double ans=0;
ans+=calc_rect(x,K1);
ans+=r*calc_rect(x/v+1,K2);
ans+=(v-r)*calc_rect(x/v,K2);
return ans;
}
int t1,t2,v1,v2;
//t1组北边一个对南边v1个,t2组北边一个对南边v2个
double calc(int x,int t,int v){//总长度x,有t组北边一个对南边v个的
if(!x) return 0;
int r=x%t;
return (t-r)*calc_area(x/t,v)+r*calc_area(x/t+1,v);
}
void work(void){
v1=N/M,v2=v1+1;
t2=N%M,t1=M-t2;
if(!t2){
v2=v1;
t1--,t2++;
}
double ans=1e9;
for(int x=t1;x<=100-t2;x++){
ans=min(ans,calc(x,t1,v1)+calc(100-x,t2,v2));
}
printf("%.1lf\n",ans);
}
int main(){
freopen("hut.in","r",stdin);
freopen("hut.out","w",stdout);
scanf("%lf%lf",&K1,&K2);
scanf("%d%d",&M,&N);
work();
return 0;
}