题目传送门(内部题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++

转载于:https://www.cnblogs.com/wzc521/p/11494272.html

[CSP-S模拟测试]:游戏(最短路)相关推荐

  1. 性能值得期待,AMD Ryzen 5/Ryzen 3处理器模拟测试

    AMD在三月初发布了锐龙Ryzen 7处理器,强劲的性能与极佳的性价比受到了玩家大量的好评,市场的反应也相当火,三款产品卖得都相当好,不过首批的Ryzen 7毕竟是高端的八核,售价2499元起步受众还 ...

  2. 利用AI技术自动测试游戏

    1.引子 近年来,游戏AI已从一种"伪智能"迭代成了真正的人工智能.3年前AlphaGo的成功只是证明了AI技术在游戏领域取得了巨大的发展,但另一方面AI技术对整个游戏行业的帮助仍 ...

  3. WebRTC通话质量调优:三个弱网模拟测试工具的使用与对比

    作为一个使用 WebRTC 独立开发者或团队,怎样才能知道自己 App 的通话质量已经"达标"了呢?如何进行合理的弱网模拟测试?介绍给开发者们三个开源工具的部署.使用方法,及其各自 ...

  4. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  5. 三维星座图查询_微信我的三维星座图测试游戏

    微信我的三维星座图测试游戏是一款简单画风打造的模拟测试类的手机游戏,玩家将通过系统给出的几个答题来选择你心中所向,不同的答题会带来不同的结果,深思熟虑享受这个测试的过程,简单的点击屏幕完成一场充满惊喜 ...

  6. 有没有测试游戏天赋的软件,抖音电竞天赋测试小游戏预约-电竞天赋测试app安卓版_第一手游网...

    电竞天赋测试小游戏是一款能够模拟测试玩家游戏天赋的趣味app,通过完成答题即可获取相关的天赋分数,不过需要注意的是要按照自己的第一直觉进行作答.包含多种擅长类型,无论是团战领导者还是高端秀操作都能一键 ...

  7. [电脑游戏]模拟经营游戏软件公司Software Inc软件公司汉化破解版下载

    电脑游戏:模拟经营游戏软件公司Software Inc软件公司汉化破解版下载 (Software Inc.)软件公司游戏特点: 雇佣员工组成一个团队,让他们从事设计,发展,支持,研发和市场等不同方面的 ...

  8. Java实验-02 模拟扑克牌游戏的洗牌

    结合面向对象设计原则,分析和设计模拟扑克牌游戏的洗牌过程. 编程定义一个表示扑克牌的类 Poke,用 suit 来表示扑克牌的花色,用 face 来表示扑克牌的 牌面值,每副牌为 52 张,不考虑包含 ...

  9. 2018冬令营模拟测试赛(十八)

    2018冬令营模拟测试赛(十八) [Problem A]Table 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述&qu ...

  10. 2018冬令营模拟测试赛(九)

    2018冬令营模拟测试赛(九) [Problem A]王子 试题描述 不是所有王子都会遇见自己的中关村,主公,公主. 从前有个王子姓王,王王子遇到了一位美丽的公主,她的名字当然是公公主啦. 王王子对公 ...

最新文章

  1. 用Debug函数实现API函数的跟踪
  2. 微软觊觎LinkedIn算法
  3. 两个问题,关于XP进程优化及SVSP虚拟存储平台
  4. 计算机二级的编程题,计算机二级编程题(范文).doc
  5. phpcmsV9找配置文件修改JS/CSS/IMG/APP_PATH、upload_path的路径?
  6. 生成随机数 java
  7. C语言 如何判断一个主机是大端还是小端
  8. webpack多页面开发与懒加载hash解决方案
  9. Div 在页面中居中
  10. java 模拟ping_模拟Ping操作的一个Java类
  11. 【书】软件设计师教程(第4版)(百度云免费下载链接)
  12. Only老K说-Java设计模式之原型模式(Prototype)
  13. Linux平台基于v4l2开发免驱摄像头-输出为Opencv Mat
  14. 利用cobbler 重装系统
  15. 1237 -- 地盘划分
  16. Win7系统重装账户被禁用的解决方法
  17. 鲁迅先生的《一件小事》
  18. 【开发工具下载汇总】
  19. js引擎渲染php,主流浏览器内核及JS引擎
  20. 正则表达式——常用正则表达式验证有效数字、密码、真实姓名、邮箱、身份证号码及其正则捕获懒惰性原理

热门文章

  1. 淘宝SDK高级模板,设计师模块开放接口详解
  2. mysql cmake ncursor_在移植的过程中主要会用到boost库、cmake工具以及wt库的编译。...
  3. 跨站请求伪造(CSRF)攻击
  4. Django 对指定数据进行批量替换和删除
  5. 我在CSDN参与的3000个帖子
  6. 9.29 烤仔建工@SANDBOX | 当烤仔在B站玩起快闪……
  7. NET Reflector——.NET反编译工具
  8. 周爱民给程序员的十点建议
  9. 如何成为一个区块链开发人员_关于成为远程开发人员的思考
  10. [wordpress] Easy Custom Auto Excerpt Options 插件头图样式修改