HDU 4355 Party All the Time (三分算法的应用(含三分算法的讲解))

本文介绍了一道关于在森林中找到最佳庆祝地点的问题,通过计算精灵们的不快值来确定最优解。使用三分法实现算法,并给出了详细的代码解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Party All the Time

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3351    Accepted Submission(s): 1050



Problem Description
In the Dark forest, there is a Fairy kingdom where all the spirits will go together and Celebrate the harvest every year. But there is one thing you may not know that they hate walking so much that they would prefer to stay at home if they need to walk a long way.According to our observation,a spirit weighing W will increase its unhappyness for S 3*W units if it walks a distance of S kilometers.
Now give you every spirit's weight and location,find the best place to celebrate the harvest which make the sum of unhappyness of every spirit the least.
 

Input
The first line of the input is the number T(T<=20), which is the number of cases followed. The first line of each case consists of one integer N(1<=N<=50000), indicating the number of spirits. Then comes N lines in the order that x [i]<=x [i+1] for all i(1<=i<N). The i-th line contains two real number : X i,W i, representing the location and the weight of the i-th spirit. ( |x i|<=10 6, 0<w i<15 )
 

Output
For each test case, please output a line which is "Case #X: Y", X means the number of the test case and Y means the minimum sum of unhappyness which is rounded to the nearest integer.
 

Sample Input
  
1 4 0.6 5 3.9 10 5.1 7 8.4 10
 

Sample Output
Case #1: 832
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4355

题意:小精灵不愿意走路,走路的话会使他们产生不高兴值,如果小精灵走的路是S体重是W那么他走S路程产生的不高兴值是ans=(S^3)*W;现在森林里要开一个庆祝会,给出各个小精灵的坐标(注意这里是一维的)和体重,求在哪里庆祝会使小精灵的不高兴值最小,输出这个最小的不高兴值。样例中第一行是样例个数,每个样例的第一行是小精灵的个数n,接下的n行是每个小精灵的坐标和体重。输出只有一个整数,即最小的不高兴值。注意输出格式。

题解:由于英语水平有限,刚开始读到这题时以为0.6是坐标(0.6)没敢做。。。后来读懂题后一时也是没有什么思路,然后想到了二分法,但是二分法一般是用来解单调的函数的,这个题明显不是单调函数,所以只好另外想办法。。。然后想到了分成三份选择性的更新某一端的值,结果再把细节弄好后居然真的AC了。。。赛后才发现居然用的是三分,原谅我比赛时不知什么是三分。。。。
三分算法适用于:凸性函数的极值问题,至于什么是凸性如图就是两种凸性函数。。。
这里以其中一种为例,比如该题以第一种为例。



如上图所示不断更新left与right,只要保证每次更新掉的是距极值(可能极大也可能极小)远的一侧就能保证每次更新后要去的极值一定在left和right之间,当left与right的差值小于题目要求的精度时(即约为相等时)left或right即为要求的极值点。
该题题目连接地址:http://acm.hdu.edu.cn/showproblem.php?pid=4355
详细细节见下面代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-5;//精度,判断left与right是否相等
const int MAXN=50100;
int n;
double p[MAXN];//记录每个位置
double w[MAXN];//记录每个W

double cal(double x){//按着题意公式计算消耗的函数
    double ans=0;
    for(int i=0;i<n;i++){
        double t=fabs(p[i]-x);
        ans+=t*t*t*w[i];
    }
    return ans;
}

double sear(double L,double R){//搜索函数,三分不断更新left或right,L为left,R为right
    double ll;double rr;//这里与上面的讲解不大一样,采用直接平均三分,ll和rr分别为中间三分点。
    while(R-L>eps){//注意浮点数不能直接判断相等,要用精度判断相等
        ll=(L*2+R)/3;//取出左侧三分点ll(ll=L+(R-L)/3经过化简就是该公式)
        rr=(L+2*R)/3;//取出右侧三分点rr(公式化简方法类似上面)
        if(cal(ll)>cal(rr)) L=ll;//更新左侧端点
        else R=rr;//更新右侧端点
    }
    return L;//返回极值点
}

int main(){
    int T;
    scanf("%d",&T);//样例个数
    int cas=1;//样例序号
    while(T--){
        scanf("%d",&n);
        double L=1111111,R=-1111111;
        for(int i=0;i<n;i++){//数据输入
            scanf("%lf%lf",&p[i],&w[i]);
            if(p[i]<L) L=p[i];//左侧端点初始化
            if(p[i]>R) R=p[i];//右侧端点初始化
        }
        double point=sear(L,R);//找出极值点point
        double ans=cal(point);//极值点代入公式计算得出最小消耗
        printf("Case #%d: %.0f\n",cas++,ans);//按格式输出
    }
    return 0;
}
要是大家哪里有不清楚的地方欢迎提问,要是有大神发现错误,望提出,感激不尽,欢迎大家的宝贵意见



内容概要:本文介绍了基于Python实现的SSA-GRU(麻雀搜索算法优化门控循环单元)时间序列预测项目。项目旨在通过结合SSA的全局搜索能力和GRU的时序信息处理能力,提升时间序列预测的精度和效率。文中详细描述了项目的背景、目标、挑战及解决方案,涵盖了从数据预处理到模型训练、优化及评估的全流程。SSA用于优化GRU的超参数,如隐藏层单元数、学习率等,以解决传统方法难以捕捉复杂非线性关系的问题。项目还提供了具体的代码示例,包括GRU模型的定义、训练和验证过程,以及SSA的种群初始化、迭代更新策略和适应度评估函数。; 适合人群:具备一定编程基础,特别是对时间序列预测和深度学习有一定了解的研究人员和技术开发者。; 使用场景及目标:①提高时间序列预测的精度和效率,适用于金融市场分析、气象预报、工业设备故障诊断等领域;②解决传统方法难以捕捉复杂非线性关系的问题;③通过自动化参数优化,减少人工干预,提升模型开发效率;④增强模型在不同数据集和未知环境中的泛化能力。; 阅读建议:由于项目涉及深度学习和智能优化算法的结合,建议读者在阅读过程中结合代码示例进行实践,理解SSA和GRU的工作原理及其在时间序列预测中的具体应用。同时,关注数据预处理、模型训练和优化的每个步骤,以确保对整个流程有全面的理解。
内容概要:本文详细介绍了如何使用PyQt5创建一个功能全面的桌面备忘录应用程序,涵盖从环境准备、数据库设计、界面设计到主程序结构及高级功能实现的全过程。首先,介绍了所需安装的Python库,包括PyQt5、sqlite3等。接着,详细描述了SQLite数据库的设计,创建任务表和类别表,并插入默认类别。然后,使用Qt Designer设计UI界面,包括主窗口、任务列表、工具栏、过滤器和日历控件等。主程序结构部分,展示了如何初始化UI、加载数据库数据、显示任务列表以及连接信号与槽。任务管理功能方面,实现了添加、编辑、删除、标记完成等操作。高级功能包括类别管理、数据导入导出、优先级视觉标识、到期日提醒、状态管理和智能筛选等。最后,提供了应用启动与主函数的代码,并展望了扩展方向,如多用户支持、云同步、提醒通知等。 适合人群:零基础或初学者,对Python和桌面应用程序开发感兴趣的开发者。 使用场景及目标:①学习PyQt5的基本使用方法,包括界面设计、信号与槽机制;②掌握SQLite数据库的基本操作,如创建表、插入数据、查询等;③实现一个完整的桌面应用程序,具备增删改查和数据持久化功能;④了解如何为应用程序添加高级特性,如类别管理、数据导入导出、到期日提醒等。 阅读建议:此资源不仅适用于零基础的学习者,也适合有一定编程经验的开发者深入理解PyQt5的应用开发。建议读者跟随教程逐步实践,结合实际操作来理解和掌握每个步骤,同时可以尝试实现扩展功能,进一步提升自己的开发技能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值