news 2026/1/7 22:56:50

UVa 11370 Moogle

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 11370 Moogle

题目描述

你正在为Maple mPhone\texttt{Maple mPhone}Maple mPhone开发一款名为Moogle Maps\texttt{Moogle Maps}Moogle Maps的地图软件。 该软件需要能够显示像“主街131313号”这样的房屋地址位置。 但由于手机存储容量有限, 你不能存储每个房屋的精确位置, 而是只存储一个子集的位置, 其余房屋的位置通过线性插值得到。 你的目标是选择要存储的房屋位置, 使得所有房屋的平均插值误差最小。 街道被视为一条直线, 并且你必须始终存储第一个和最后一个房屋的位置。

给定你存储了房屋iiijjj的位置xix_ixixjx_jxj, 且它们之间没有存储其他房屋, 则对于房屋编号kkk(满足i<k<ji < k < ji<k<j), 其插值位置为:

xi+(xj−xi)⋅k−ij−i x_i + (x_j - x_i) \cdot \frac{k-i}{j-i}xi+(xjxi)jiki

输入格式

第一行包含一个整数ttt1≤t≤501 \leq t \leq 501t50), 表示测试用例的数量。

每个测试用例包含两行。 第一行包含两个整数hhhccc2≤h≤2002 \leq h \leq 2002h2002≤c≤h2 \leq c \leq h2ch), 其中hhh是街道上的房屋数量,ccc是可以存储的房屋位置数量。 第二行包含hhh个按递增顺序排列的整数, 表示每个房屋的位置, 每个位置在区间[0,1000000][0, 1000000][0,1000000]内。

输出格式

对于每个测试用例, 输出在最优选择ccc个房屋位置存储的情况下, 所有hhh个房屋的平均插值误差。 输出应保留四位小数, 允许±0.001\pm 0.001±0.001的误差。

题目分析

这是一个典型的动态规划问题, 需要在必须选择第一个和最后一个房屋位置的约束下, 从hhh个点中选择ccc个点进行存储, 使得所有点的插值误差(绝对误差)的平均值最小。

核心思路

  1. 误差计算: 如果选择存储房屋iiijjji<ji < ji<j), 且它们之间没有其他存储点, 则对于中间的任何房屋kkki<k<ji < k < ji<k<j), 其插值误差为∣xk−(xi+(xj−xi)⋅k−ij−i)∣\lvert x_k - (x_i + (x_j - x_i) \cdot \frac{k-i}{j-i}) \rvertxk(xi+(xjxi)jiki)∣。 我们可以预先计算任意两点iiijjj作为相邻存储点时, 中间所有房屋的误差和, 记为error[i][j]error[i][j]error[i][j]

  2. 动态规划状态定义: 定义dp[i][k]dp[i][k]dp[i][k]表示以房屋iii作为第kkk个被存储的点时, 前iii个房屋(包括iii)的最小总误差和。 这里“第kkk个”意味着我们总共选择了kkk个存储点, 并且最后一个点正好是iii

  3. 状态转移方程: 要计算dp[i][k]dp[i][k]dp[i][k], 我们需要考虑上一个存储点jjjj<ij < ij<i), 且jjj是第k−1k-1k1个存储点。 那么从jjjiii之间的房屋(不包括jjjiii)的误差就是error[j][i]error[j][i]error[j][i]。 因此, 状态转移方程为:
    dp[i][k]=min⁡0≤j<i{dp[j][k−1]+error[j][i]} dp[i][k] = \min_{0 \leq j < i} \{ dp[j][k-1] + error[j][i] \}dp[i][k]=0j<imin{dp[j][k1]+error[j][i]}

  4. 边界条件: 由于第一个房屋必须被存储, 所以dp[0][1]=0dp[0][1] = 0dp[0][1]=0。 其他状态初始化为一个很大的值(表示不可达或误差无穷大)。

  5. 最终答案: 由于最后一个房屋也必须被存储, 我们需要的是dp[h−1][c]dp[h-1][c]dp[h1][c], 即最后一个房屋是第ccc个存储点时的最小总误差。 平均误差即为dp[h−1][c]/hdp[h-1][c] / hdp[h1][c]/h

算法步骤

  1. 读取输入数据。
  2. 对于每个测试用例:
    • 读取hhh,ccc和房屋位置数组loclocloc
    • 预处理计算errorerrorerror矩阵: 对于所有0≤i<j<h0 \leq i < j < h0i<j<h, 计算error[i][j]error[i][j]error[i][j]
    • 初始化dpdpdp数组为无穷大, 设置dp[0][1]=0dp[0][1] = 0dp[0][1]=0
    • 进行动态规划: 遍历iii000h−1h-1h1kkk111ccc, 对于每个合法的dp[i][k]dp[i][k]dp[i][k], 尝试将其状态转移到所有j>ij > ij>i作为下一个存储点。
    • 计算平均误差dp[h−1][c]/hdp[h-1][c] / hdp[h1][c]/h并输出。
  3. 输出结果保留四位小数。

复杂度分析

  • 时间复杂度: 预处理errorerrorerror矩阵需要O(h3)O(h^3)O(h3), 动态规划需要O(h2c)O(h^2 c)O(h2c)。 由于h≤200h \leq 200h200c≤hc \leq hch, 总计算量在可接受范围内。
  • 空间复杂度: 需要O(h2)O(h^2)O(h2)存储errorerrorerror矩阵和O(h×c)O(h \times c)O(h×c)存储dpdpdp数组。

代码实现

// Moogle// UVa ID: 11370// Verdict: Accepted// Submission Date: 2025-12-20// UVa Run Time: 0.040s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;doublesolve(){inth,c;cin>>h>>c;vector<double>loc(h);for(inti=0;i<h;i++)cin>>loc[i];// 计算误差矩阵:error[i][j] 表示存储点 i 和 j 之间(不包括 i, j)的误差和vector<vector<double>>error(h,vector<double>(h,0.0));for(inti=0;i<h;i++){for(intj=i+1;j<h;j++){doublesum=0.0;for(intk=i+1;k<j;k++){// 计算房屋 k 的插值位置doubleinterp=loc[i]+(loc[j]-loc[i])*(k-i)/double(j-i);sum+=fabs(interp-loc[k]);// 累加绝对误差}error[i][j]=sum;}}// dp[i][k]: 以房屋 i 作为第 k 个存储点的最小误差和vector<vector<double>>dp(h,vector<double>(c+1,1e30));dp[0][1]=0.0;// 第一个房屋是第一个存储点,误差为0// 动态规划for(inti=0;i<h;i++){for(intk=1;k<=c;k++){if(dp[i][k]>1e29)continue;// 不可达状态// 尝试将 i 作为当前最后一个存储点,选择下一个存储点 jfor(intj=i+1;j<h;j++){if(k+1<=c){dp[j][k+1]=min(dp[j][k+1],dp[i][k]+error[i][j]);}}}}// 最后一个房屋必须是第 c 个存储点returndp[h-1][c]/h;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cout<<fixed<<setprecision(4);intt;cin>>t;while(t--)cout<<solve()<<"\n";return0;}

总结

本题的关键在于将问题转化为一个动态规划模型, 并正确处理必须选择首尾房屋的约束条件。 通过预处理任意两点作为相邻存储点时的误差和, 我们可以高效地进行状态转移。 算法的时间复杂度对于题目给定的数据范围是完全可行的。 注意在实现时, 要使用double类型来存储误差值, 并在输出时控制精度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/2 20:03:16

如何评估Linly-Talker生成视频的真实感?主观测评方法

如何评估Linly-Talker生成视频的真实感&#xff1f;主观测评方法 在虚拟主播、AI教师和数字客服日益普及的今天&#xff0c;用户对“像不像真人”越来越敏感。一个眼神迟滞、口型错位的数字人&#xff0c;哪怕技术再先进&#xff0c;也难以赢得信任。而Linly-Talker这样的系统&…

作者头像 李华
网站建设 2026/1/1 14:26:57

15、Windows Server DHCP 安装、授权与管理全解析

Windows Server DHCP 安装、授权与管理全解析 1. DHCP 基础与安装 在客户端和服务器处于不同 IP 网络的情况下,若客户端网络中没有可用的 DHCP 服务器,可以使用 DHCP 中继代理将 DHCP 广播从客户端网络转发到 DHCP 服务器。中继代理就像一个无线电中继器,监听 DHCP 客户端…

作者头像 李华
网站建设 2026/1/5 1:27:49

Linly-Talker模型更新日志:v2.1版本新增五大功能

Linly-Talker v2.1&#xff1a;当数字人真正“听懂”你说话 在智能客服越来越像“自动回复机”的今天&#xff0c;用户早已厌倦了预设话术的冰冷回应。我们真正期待的是一个能听、会想、能说、有表情的数字伙伴——不是播放录音的提线木偶&#xff0c;而是具备实时交互能力的AI…

作者头像 李华
网站建设 2026/1/7 11:32:24

Linly-Talker能否接入企业微信/钉钉?API对接说明

Linly-Talker 接入企业微信与钉钉的 API 对接实践 在现代企业数字化转型的浪潮中&#xff0c;智能办公已不再局限于文档协同和流程审批。越来越多的企业开始探索如何通过 AI 数字人技术提升沟通效率、优化客户服务体验。尤其是在企业微信和钉钉这两个占据国内企业协作市场主导地…

作者头像 李华
网站建设 2025/12/26 18:09:12

64、Windows 8 TCP/IP网络配置与故障排除指南

Windows 8 TCP/IP网络配置与故障排除指南 在当今数字化时代,网络连接对于计算机的正常使用至关重要。Windows 8系统提供了丰富的功能来配置和管理TCP/IP网络,同时也具备强大的故障排除工具。本文将详细介绍Windows 8系统中TCP/IP网络的配置、管理以及故障排除的相关内容。 …

作者头像 李华