先从简单的说

确实

我是看着AC率高的才选的 没有辜负我的期望 他真的很简单

数据范围很小

一眼floyd

然后就秒了

注意得就是我们还是把每个点编号再跑最短路

然后我们可以把相邻的四个放一起处理

还有他只给了三个点 但是很简单就可以推出来 xd=xc+xb-xa cb为对角线 y同理

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int M = 410;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
double diss(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
double ds(double x1,double y1,double x2,double y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}
int n,s,t,a,b;
double dis[M][M],x[M],y[M],T[M];
signed main() {fastcin>>n;while(n--){cin>>s>>t>>a>>b;for(int i=1;i<=s;i++){cin>>x[(i-1)*4+1]>>y[(i-1)*4+1]>>x[(i-1)*4+2]>>y[(i-1)*4+2]>>x[(i-1)*4+3]>>y[(i-1)*4+3]>>T[i];auto x1=x[(i-1)*4+1],x2=x[(i-1)*4+2],x3=x[(i-1)*4+3];auto y1=y[(i-1)*4+1],y2=y[(i-1)*4+2],y3=y[(i-1)*4+3];double d1=diss(x1,y1,x2,y2),d2=diss(x1,y1,x3,y3),d3= diss(x2,y2,x3,y3);if(d2>d1&&d2>d3){x[(i-1)*4+4]=x1+x3-x2,y[(i-1)*4+4]=y1+y3-y2;}else if(d1>d2&&d1>d3){x[(i-1)*4+4]=x1+x2-x3,y[(i-1)*4+4]=y1+y2-y3;}else{x[(i-1)*4+4]=x2+x3-x1,y[(i-1)*4+4]=y2+y3-y1;}}for(int i=1;i<=s*4;i++)for(int j=1;j<=4*s;j++)if((i-1)/4!=(j-1)/4)dis[i][j]=t*diss(x[i],y[i],x[j],y[j]);//else dis[i][j]=T[(i-1)/4+1]*diss(x[i],y[i],x[j],y[j]);for(int k=1;k<=4*s;k++)for(int i=1;i<=s<<2;i++)for(int j=1;j<=s<<2;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);double ans=2e9;for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)ans=min(ans,dis[(a-1)*4+i][(b-1)*4+j]);printf("%.1lf",ans);}return 0^0;
}

这道题暴力反正我只得了10分外加很多TLE

本来想好好的dp

可是看了题解发现记忆化搜索也可以通过

那就稍微尝试了一下记忆化搜索

不过不得不说这道题的难度在pj是不是真的有点超纲啊!

那我就来顺着思路好好讲一下啊:

首先我们拿到这个题 sort一遍肯定是不用说的

可是贪心是必不可能是最优解的

那我们考虑搜索(其实记忆化搜索就是再维护了一个f[]来避免重复搜索无用的)

首先我们可以清楚一点

要是有人来的时候 我们就可以发车 并且回来的时候又有人来 那我们就继续发车

直到没有人在站点 那我们就直接跳到 下次有人来的时间段 重复上面的操作

或者 我们可以等一会儿 再进行一波发车 

要注意的就是我们搜索时 要把先前等着的人花费的时间加上去

让后我们这里还加了一个小剪枝if(s>=ans)return; 意思就是要是我们现在等的人时间已经超过了我最后ans那么后面再牛逼都不行了

每次发车之前要是我们有更少的罚时也就是f【】才走过去 并且更新f【】

还有这里有个引理下次我再来证试试

我其实都是构造了很多组解猜想得的

#include <bits/stdc++.h>
using namespace std;
const int N = 4e6+10;
const int M = 5e5+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int n,m,a[N],ans=2e9,f[N];
void dfs(int t,int k){if(k==n){ans=min(ans,f[t]);return;}int s=0,b;for(int i=k+1;i<=n;i++){if(a[i]<=t+m){s+=t+m-a[i];if(s>=ans)return;//b=i;}else break;}if(f[t]+s<f[t+m]&&t+m-a[k+1]>=0){//f[t+m]=f[t]+s;dfs(t+m,b);}s=0;for(int i=k+1;i<=n;i++){s+=(i-k-1)*(a[i]-a[i-1]);if(s>=ans)return;if(f[t]+s<f[a[i]]&&t+m<=a[i]&&a[i]!=a[i+1]){f[a[i]]=f[t]+s;dfs(a[i],i);}}
}
signed main() {fastcin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);memset(f,0x3f3f,sizeof f);int sum=0;for(int i=1;i<=n;i++){sum+=(a[i]-a[i-1])*(i-1);f[a[i]]=min(sum,f[a[i]]);if(a[i]!=a[i+1])dfs(a[i],i);}cout<<ans<<endl;return 0^0;
}

哦!

今天来补一下昨天的证明

今天头脑额外清晰!

我们可以把每个学生到的时间整个数轴

然后把这个发车时间整成这个螺丝一样的东西

我们只能上下移动m

因为其周期为m 我们必定可以得到其全部方案!

正确性显然!

P5017 [NOIP2018 普及组] 摆渡车(pj组最后一道蓝) P1027 [NOIP2001 提高组] Car 的旅行路线(提高组第一道蓝)相关推荐

  1. P5017 NOIP2018 普及组 摆渡车

    P5017 NOIP2018 普及组 摆渡车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 显然要把人按照到达时间排序.然后考虑 dp. 设 \(f(i)\) 表示前 \(i\) ...

  2. P5017 [NOIP2018 普及组] 摆渡车 题解

    题目传送门 题目描述 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送 ...

  3. 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树

    [题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...

  4. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗

    [题目链接] ybt 1979: [18NOIP普及组]龙虎斗 洛谷 P5016 [NOIP2018 普及组] 龙虎斗 [题目考点] 1. long long类型使用 已知变量a, b是int类型的变 ...

  5. 信息学奥赛一本通 1978:【18NOIP普及组】标题统计 | 洛谷 P5015 [NOIP2018 普及组] 标题统计

    [题目链接] ybt 1978:[18NOIP普及组]标题统计 洛谷 P5015 [NOIP2018 普及组] 标题统计 [题目考点] 1. 字符串 读入带空格的字符串 将带空格的字符串读入字符数组 ...

  6. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  7. python二元一次方程组用鸡兔同笼的思路来写编程_python二元一次方程组用鸡兔同笼的思路来写编程_《应用二元一次方程组——鸡兔同笼》......

    - 1 - <应用二元一次方程组 -- 鸡兔同笼> 教学目标 1 ,知识与技能:会用二元一次方程组 在具体问题的解决过程中提高学生的解二 元一次方程组的技能: 2 .过程与方法:使学生掌握 ...

  8. P1027 [NOIP2001 提高组] Car 的旅行路线 (图 最短路)

    原题链接:[NOIP2001 提高组] Car 的旅行路线 - 洛谷 AC代码: #include<bits/stdc++.h> using namespace std; #define ...

  9. win7 家庭组连接 使用用户账号和密码连接到其他计算机,win7密码正确不能加入家庭组...

    win7密码正确组原因及解决方法:单",然后按照向导中的步骤操作.如运行 Fix It 向导无法解决问题,请参考下面的列表:网络中没有可用的家庭组.若要创建一个家庭组,请参阅创建家庭组.可能 ...

最新文章

  1. python 如何生成特定间隔数列?range()、numpy.arange()
  2. C++库文件导出可见性
  3. 干货 | 算法工程师入门第二期——穆黎森讲增强学习(一)
  4. python的应用论文_python 论文
  5. 旅游系统_数字洛江智慧旅游系统助力提升旅游安全水平
  6. HH SaaS电商系统的跨境商品展示、下单、清关、出库全流程设计
  7. linux火狐自动更新,CentOS 7手动更新firefox | Linux系统运维联盟
  8. oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
  9. windows下完美的免费QT开发环境: QtCreator + VC2008Express
  10. 第三方支付系统技术分享
  11. box-shadow属性详解
  12. Linux修改时间 修改时区 | Linux时间校准
  13. 如何让新建网站被搜索引擎快速收录
  14. pyQt5 学习笔记(6)设置鼠标(光标)样式
  15. Release That Record Lock!
  16. ubuntu16.04+gtx1050驱动安装记录
  17. SVN介绍及使用总结
  18. 【Tushare转存SQL】可转债数据(待续)
  19. 补缴2个月社保折腾1年多 刁钻政策玩死人
  20. C语言实现把字节数转化成kb,C语言笔记

热门文章

  1. 图片转素描的工具汇总
  2. python判断一个字符串是不是ip地址
  3. android安卓导航下载地址,安卓导航辅助软件:Android搜星帮助文件
  4. 龙族幻想最新东京机器人位置_龙族幻想东京攻略异闻怎么触发_龙族幻想东京攻略异闻详细攻略_求知软件网...
  5. 蓝桥杯 算法训练 王,后传说
  6. react手机号码344格式分割
  7. 2021年度总结——熬了3 年的芯片今晚来了
  8. SpEL之#和$的区别
  9. linux清除僵尸进程,如何清理和避免linux系统僵尸进程
  10. 学习社会工程学需要什么前置知识