[CSP-S模拟测试]:游戏(最短路)
题目传送门(内部题35)
输入格式
第一行,两个正整数$X,Y$。
第二行,三个非负整数$A,B,C$。
第三行,一个正整数$N$。
接下来$N$行,每行两个非负整数$x_i,y_i$。
输出格式
一行,一个非负整数表示答案。
样例
样例输入1:
6 5
1 3 6
3
1 1
0 4
6 5
样例输出1:
26
样例输入2:
3 3
0 50 10
2
0 0
3 3
样例输出2:
60
样例输入3:
4 6
0 5 1000
6
3 1
4 6
3 0
3 0
4 0
0 4
样例输出3:
2020
数据范围与提示
对于所有数据,$1\leqslant X,Y\leqslant 500,0\leqslant A,B,C\leqslant {10}^9,2\leqslant N\leqslant {10}^5,(x_1,y_1)\neq (x_N,y_N)$。

题解
$20\%$算法:
一堆$if,else$,打对$20$分就到手了。
时间复杂度:$\Theta(1)$。
期望得分:$20$分。
实际得分:$20$分。
$60\%$算法:
发现$A=0$,所以我们可以将所有的莉露露连边,然后跑对短路就好了。
记得结合上面的代码。
时间复杂度:$\Theta(N^2\log N^2)$。
期望得分:$60$分。
实际得分:$60$分。
$100\%$算法:
发现肯定是最近的莉露露过来,所以我们可以多源点$BFS$预处理出来每个点最近的莉露露。
然后对于移动的操作,显然我们不能将一条路径上每对点都连边,所以我们可以只和临近的四个点连边即可。
对于抛的操作,分为横着抛和竖着抛,然后将最近的莉露露连过来即可。
注意需要建三张图,因为抛的操作不能中途转向(我也是调了好久才发现……),可以不建边跑最短路。
时间复杂度:$\Theta(n+XY\log XY)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
$20\%$算法:
#include<bits/stdc++.h>
using namespace std;
long long X,Y,N;
long long A,B,C;
pair<long long,long long> pos[100001];
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&X,&Y,&A,&B,&C,&N);
for(long long i=1;i<=N;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
pos[i]=make_pair(x,y);
}
long long ans=0;
bool flag1=0,flag2=0;
long long deltax=abs(pos[1].first-pos[2].first);
long long deltay=abs(pos[1].second-pos[2].second);
if(C*deltax<A*deltax+B){ans+=C*deltax;flag1=1;}
if(C*deltay<A*deltay+B){ans+=C*deltay;flag2=1;}
if(flag1&&flag2){printf("%lld",ans);return 0;}
if(flag1){printf("%lld",ans+A*deltay+B);return 0;}
if(flag2){printf("%lld",ans+A*deltax+B);return 0;}
printf("%lld",min(C*deltax+A*deltay+B,C*deltay+A*deltax+B));
return 0;
}
$60\%$算法:
#include<bits/stdc++.h>
using namespace std;
struct rec
{
long long nxt,to,w;
}e[2000010];
long long head[1010],cnt;
long long X,Y,N;
long long A,B,C;
long long dis[1010];
pair<long long,long long> pos[100001];
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > >q;
bool vis[1010];
void add(long long x,long long y,long long w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void Dij()
{
for(long long i=2;i<=N;i++)dis[i]=200209230020020923;
q.push(make_pair(0,1));
while(!q.empty())
{
long long flag=q.top().second;
q.pop();
if(vis[flag])continue;
vis[flag]=1;
for(long long i=head[flag];i;i=e[i].nxt)
if(dis[e[i].to]>dis[flag]+e[i].w)
{
dis[e[i].to]=dis[flag]+e[i].w;
q.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&X,&Y,&A,&B,&C,&N);
for(long long i=1;i<=N;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
pos[i]=make_pair(x,y);
}
if(N<=1000&&!A)
{
for(long long i=1;i<=N;i++)
for(long long j=i+1;j<=N;j++)
{
long long ans=0;
bool flag1=0,flag2=0;
long long deltax=abs(pos[i].first-pos[j].first);
long long deltay=abs(pos[i].second-pos[j].second);
if(C*deltax<A*deltax+B){ans+=C*deltax;flag1=1;}
if(C*deltay<A*deltay+B){ans+=C*deltay;flag2=1;}
if(flag1&&flag2){add(i,j,ans);add(j,i,ans);continue;}
if(flag1){add(i,j,ans+A*deltay+B);add(j,i,ans+A*deltay+B);continue;}
if(flag2){add(i,j,ans+A*deltax+B);add(j,i,ans+A*deltax+B);continue;}
add(i,j,min(C*deltax+A*deltay+B,C*deltay+A*deltax+B));
add(j,i,min(C*deltax+A*deltay+B,C*deltay+A*deltax+B));
}
Dij();
cout<<dis[N]<<endl;
return 0;
}
long long ans=0;
bool flag1=0,flag2=0;
long long deltax=abs(pos[1].first-pos[2].first);
long long deltay=abs(pos[1].second-pos[2].second);
if(C*deltax<A*deltax+B){ans+=C*deltax;flag1=1;}
if(C*deltay<A*deltay+B){ans+=C*deltay;flag2=1;}
if(flag1&&flag2){printf("%lld",ans);return 0;}
if(flag1){printf("%lld",ans+A*deltay+B);return 0;}
if(flag2){printf("%lld",ans+A*deltax+B);return 0;}
printf("%lld",min(C*deltax+A*deltay+B,C*deltay+A*deltax+B));
return 0;
}
$100\%$算法:
#include<bits/stdc++.h>
using namespace std;
struct node{long long x,y;};
struct rec
{
long long x,y,w;
long long val;
};
long long X,Y,N;
long long A,B,C;
long long Map[600][600];
long long dis[600][600][3];
bool vis[600][600][3];
pair<long long,long long> pos[1000001];
queue<node> q;
priority_queue<rec> dij;
bool operator<(rec a,rec b){return a.val>b.val;}
void pre_work()
{
memset(dis,0x15f,sizeof(dis));
memset(Map,-1,sizeof(Map));
}
void BFS()
{
while(q.size())
{
long long x=q.front().x;
long long y=q.front().y;
q.pop();
if(x<X&&Map[x+1][y]==-1)
{
Map[x+1][y]=Map[x][y]+1;
q.push((node){x+1,y});
}
if(x&&Map[x-1][y]==-1)
{
Map[x-1][y]=Map[x][y]+1;
q.push((node){x-1,y});
}
if(y<Y&&Map[x][y+1]==-1)
{
Map[x][y+1]=Map[x][y]+1;
q.push((node){x,y+1});
}
if(y&&Map[x][y-1]==-1)
{
Map[x][y-1]=Map[x][y]+1;
q.push((node){x,y-1});
}
}
}
void Dij()
{
dis[pos[1].first][pos[1].second][0]=0;
dij.push((rec){pos[1].first,pos[1].second,0,0});
while(!dij.empty())
{
long long x=dij.top().x;
long long y=dij.top().y;
long long w=dij.top().w;
dij.pop();
if(x==pos[N].first&&y==pos[N].second&&!w)break;
if(vis[x][y][w])continue;
vis[x][y][w]=1;
switch(w)
{
case 0:
if(x&&dis[x][y][0]+C<dis[x-1][y][0])
{
dis[x-1][y][0]=dis[x][y][0]+C;
dij.push((rec){x-1,y,0,dis[x-1][y][0]});
}
if(x<X&&dis[x][y][0]+C<dis[x+1][y][0])
{
dis[x+1][y][0]=dis[x][y][0]+C;
dij.push((rec){x+1,y,0,dis[x+1][y][0]});
}
if(y&&dis[x][y][0]+C<dis[x][y-1][0])
{
dis[x][y-1][0]=dis[x][y][0]+C;
dij.push((rec){x,y-1,0,dis[x][y-1][0]});
}
if(y<Y&&dis[x][y][0]+C<dis[x][y+1][0])
{
dis[x][y+1][0]=dis[x][y][0]+C;
dij.push((rec){x,y+1,0,dis[x][y+1][0]});
}
if(dis[x][y][0]+Map[x][y]*C<dis[x][y][1])
{
dis[x][y][1]=dis[x][y][0]+Map[x][y]*C;
dij.push((rec){x,y,1,dis[x][y][1]});
}
if(dis[x][y][0]+Map[x][y]*C<dis[x][y][2])
{
dis[x][y][2]=dis[x][y][0]+Map[x][y]*C;
dij.push((rec){x,y,2,dis[x][y][2]});
}
break;
case 1:
if(x<X&&dis[x][y][1]+A<dis[x+1][y][1])
{
dis[x+1][y][1]=dis[x][y][1]+A;
dij.push((rec){x+1,y,1,dis[x+1][y][1]});
}
if(x&&dis[x][y][1]+A<dis[x-1][y][1])
{
dis[x-1][y][1]=dis[x][y][1]+A;
dij.push((rec){x-1,y,1,dis[x-1][y][1]});
}
if(dis[x][y][1]+B<dis[x][y][0])
{
dis[x][y][0]=dis[x][y][1]+B;
dij.push((rec){x,y,0,dis[x][y][0]});
}
break;
case 2:
if(y<Y&&dis[x][y][2]+A<dis[x][y+1][2])
{
dis[x][y+1][2]=dis[x][y][2]+A;
dij.push((rec){x,y+1,2,dis[x][y+1][2]});
}
if(y&&dis[x][y][2]+A<dis[x][y-1][2])
{
dis[x][y-1][2]=dis[x][y][2]+A;
dij.push((rec){x,y-1,2,dis[x][y-1][2]});
}
if(dis[x][y][2]+B<dis[x][y][0])
{
dis[x][y][0]=dis[x][y][2]+B;
dij.push((rec){x,y,0,dis[x][y][0]});
}
break;
}
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&X,&Y,&A,&B,&C,&N);
pre_work();
for(long long i=1;i<=N;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
pos[i]=make_pair(x,y);
q.push((node){x,y});
Map[x][y]=0;
}
BFS();
Dij();
printf("%lld",dis[pos[N].first][pos[N].second][0]);
return 0;
}
rp++
[CSP-S模拟测试]:游戏(最短路)的更多相关文章
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- Python 的mock模拟测试介绍
如何不靠耐心测试 可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unitt ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- csp-s模拟测试96
csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...
- csp-s模拟测试92
csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
随机推荐
- 八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)
一.std::condition_variable 用在多线程中. 线程A:等待一个条件满足 线程B:专门在消息队列中扔消息,线程B触发了这个条件,A就满足条件了,可以继续执行 std::condit ...
- dubbo漫谈二
转:腾信视频 阿甘 https://ke.qq.com/course/216518 https://blog.csdn.net/u013142781/article/details/50396621 ...
- Archive.org:互联网档案馆
Archive.org:互联网档案馆 2009年的最后一天,辞旧迎新,互联网也同样如此,在过往40年的基础上一步步积累发展.对于我们而言很希望通过以往的每个网页.见证和找寻历史,这就是今天所介绍的 ...
- error MSB8008: 指定的平台工具集(v110)未安装或无效
转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...
- 爱奇艺面试Python,竟然挂在第5轮…(转)
今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? 我:(这声音也太酥了吧我 ...
- python3 装饰器修复技术@wraps到底是什么?
Python 装饰器中的@wraps的作用: 装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等 @wraps(view_func)的作用: 不改变使 ...
- 数论---lcm和gcd
cd即最大公约数,lcm即最小公倍数. 首先给出a×b=gcd×lcm 证明:令gcd(a,b)=k,a=xk,b=yk,则a×b=xykk,而lcm=xyk,所以ab=gcd*lcm. 所以求lcm ...
- STL中的查找
一.查找 1.头文件 #include <algorithm> 2.使用方法 1.binary_search:查找某个元素是否出现.O(logn) a.函数模板:binary_search ...
- easyUI学习笔记一
1.引用js文件 <script type="text/javascript" src = jquery-easyui/jquery.min.js> </scri ...
- go中整型的用法小结
示例 // 整型的用法小结 // 注意: // 整型变量在使用时,遵循保小不保大的原则 // 尽量使用占用空间小的数据类型 package main import ( "fmt" ...