P5017 [NOIP2018 普及组] 摆渡车(pj组最后一道蓝) P1027 [NOIP2001 提高组] Car 的旅行路线(提高组第一道蓝)
先从简单的说
确实
我是看着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 的旅行路线(提高组第一道蓝)相关推荐
- P5017 NOIP2018 普及组 摆渡车
P5017 NOIP2018 普及组 摆渡车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 显然要把人按照到达时间排序.然后考虑 dp. 设 \(f(i)\) 表示前 \(i\) ...
- P5017 [NOIP2018 普及组] 摆渡车 题解
题目传送门 题目描述 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送 ...
- 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
[题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...
- 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
[题目链接] ybt 1979: [18NOIP普及组]龙虎斗 洛谷 P5016 [NOIP2018 普及组] 龙虎斗 [题目考点] 1. long long类型使用 已知变量a, b是int类型的变 ...
- 信息学奥赛一本通 1978:【18NOIP普及组】标题统计 | 洛谷 P5015 [NOIP2018 普及组] 标题统计
[题目链接] ybt 1978:[18NOIP普及组]标题统计 洛谷 P5015 [NOIP2018 普及组] 标题统计 [题目考点] 1. 字符串 读入带空格的字符串 将带空格的字符串读入字符数组 ...
- 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算
[题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...
- python二元一次方程组用鸡兔同笼的思路来写编程_python二元一次方程组用鸡兔同笼的思路来写编程_《应用二元一次方程组——鸡兔同笼》......
- 1 - <应用二元一次方程组 -- 鸡兔同笼> 教学目标 1 ,知识与技能:会用二元一次方程组 在具体问题的解决过程中提高学生的解二 元一次方程组的技能: 2 .过程与方法:使学生掌握 ...
- P1027 [NOIP2001 提高组] Car 的旅行路线 (图 最短路)
原题链接:[NOIP2001 提高组] Car 的旅行路线 - 洛谷 AC代码: #include<bits/stdc++.h> using namespace std; #define ...
- win7 家庭组连接 使用用户账号和密码连接到其他计算机,win7密码正确不能加入家庭组...
win7密码正确组原因及解决方法:单",然后按照向导中的步骤操作.如运行 Fix It 向导无法解决问题,请参考下面的列表:网络中没有可用的家庭组.若要创建一个家庭组,请参阅创建家庭组.可能 ...
最新文章
- python 如何生成特定间隔数列?range()、numpy.arange()
- C++库文件导出可见性
- 干货 | 算法工程师入门第二期——穆黎森讲增强学习(一)
- python的应用论文_python 论文
- 旅游系统_数字洛江智慧旅游系统助力提升旅游安全水平
- HH SaaS电商系统的跨境商品展示、下单、清关、出库全流程设计
- linux火狐自动更新,CentOS 7手动更新firefox | Linux系统运维联盟
- oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
- windows下完美的免费QT开发环境: QtCreator + VC2008Express
- 第三方支付系统技术分享
- box-shadow属性详解
- Linux修改时间 修改时区 | Linux时间校准
- 如何让新建网站被搜索引擎快速收录
- pyQt5 学习笔记(6)设置鼠标(光标)样式
- Release That Record Lock!
- ubuntu16.04+gtx1050驱动安装记录
- SVN介绍及使用总结
- 【Tushare转存SQL】可转债数据(待续)
- 补缴2个月社保折腾1年多 刁钻政策玩死人
- C语言实现把字节数转化成kb,C语言笔记
热门文章
- 图片转素描的工具汇总
- python判断一个字符串是不是ip地址
- android安卓导航下载地址,安卓导航辅助软件:Android搜星帮助文件
- 龙族幻想最新东京机器人位置_龙族幻想东京攻略异闻怎么触发_龙族幻想东京攻略异闻详细攻略_求知软件网...
- 蓝桥杯 算法训练 王,后传说
- react手机号码344格式分割
- 2021年度总结——熬了3 年的芯片今晚来了
- SpEL之#和$的区别
- linux清除僵尸进程,如何清理和避免linux系统僵尸进程
- 学习社会工程学需要什么前置知识