1 条题解

  • 1
    @ 2022-8-27 8:58:16
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #define MAXN 110
    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;//记得特判,防止除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(){//主函数So easy!
    	init();
    	work();
    	return 0;
    }
    
    • 1

    信息

    ID
    1505
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者