2017年计蒜客比赛复赛B D两题
来源:互联网 发布:淘宝视频拍摄手机软件 编辑:程序博客网 时间:2024/05/22 08:01
B题目:https://nanti.jisuanke.com/t/15967
分析:让你判断最后画在该点上的最后的线段标号,采用直线的上点的更新,(斜率存在和斜率不存在)记录每个点的最后的画上去线段的编号
AC代码:
#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <map>#include <vector>#include <cstring>#include <algorithm>#include <set>using namespace std;const int max_n = 255;int n,m,q;int gra[max_n][max_n];int a,b,c,d;int main() { scanf("%d%d",&n,&m); memset(gra,0,sizeof(gra)); for(int i = 1; i <= n; i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(a == c) { int y = b,my=d; if(b > d) { y = d; my = b; } for(; y <= my; ++y) { gra[a][y] = i; } } else { double k = ((b-d)*1.0)/(a-c); int x = a,mx = c; if(a > c) { x = c; mx = a; } for(; x <= mx; x++) { int y = (k*(x-a)+b)*1.0+0.5; if((b-y)*(c-x) == (d-y)*(a-x)) { gra[x][y] = i; } } } } scanf("%d",&q); while(q--) { scanf("%d%d",&a,&b); printf("%d\n",gra[a][b]); } return 0;}
注意:此题会卡精度啊,必须加上0.5进行四舍五入啊,gg!
D题目:https://nanti.jisuanke.com/t/15969百度地图上有 n 个城市,城市编号依次为 1 到 n。地图中有若干个城市群,编号依次为 1 到 m。每个城市群包含一个或多个城市;每个城市可能属于多个城市群,也可能不属于任何城市群。
地图中有两类道路。第一类道路是 城市之间的快速路,两个城市 u,v 之间增加一条距离为 c 的边;第二类道路是 城市群之间的高速路,连接两个城市群 a,b,通过这条高速路,城市群 a 里的每个城市与城市群 b 里的每个城市之间两两增加一条距离为 c 的边。图中所有边均为无向边。
你需要计算从城市 s 到城市 t 的最短路。
输入格式
第一行输入 n(1≤n≤20000), m(0≤m≤20000),分别表示城市总数和城市群总数。
接下来一共输入 m 行。
第 i 行首先输入一个 ki(1≤ki≤n),表示第 i个城市群中的城市数为 ki。接下来输入 ki 个数,表示第 i 个城市群中每个城市的编号(保证一个城市群内的城市编号不重复且合法,∑i=1mki≤20000)。
下一行输入一个整数 m1(0≤m1≤20000),表示有 m1 条第一类道路,即 城市之间的快速路。
接下来 m1 行,每行输入三个整数 ui,vi(1≤ui,vi≤n),ci(1≤ci≤106),分别表示快速路连接的两个城市编号和边的距离。
下一行输入一个整数 m2(0≤m2≤20000),表示有 m2 条第二类道路,即 城市群之间的高速路。
接下来 m2 行,每行输入三个整数 ai,bi(1≤ai,bi≤m),li(1≤li≤106),分别表示快速路连接的两个城市群编号和边的距离。
最后一行输入 s,t(1≤s,t≤n),表示起点和终点城市编号。
输出格式
输出一个整数,表示城市 s 到城市 t 到最短路。如果不存在路径,则输出-1
。
样例说明
1 -> 2 - > 5
或者1 -> 4 -> 5
是最短的路径,总长度为 12。
样例输入
5 42 5 12 2 41 32 3 421 2 91 5 1821 2 61 3 101 5
样例输出
12
AC 代码:
#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <map>#include <vector>#include <cstring>#include <algorithm>#include <set>using namespace std;typedef long long LL;const int max_m = 20010;const LL INF = 0x3f3f3f3f3f3f3f3f;int n,m;int a,b,m1,m2;LL c;vector<pair<int,LL> >gra[3*max_m];LL d[3*max_m];void dijkstra(int s) { priority_queue<pair<LL,int> >Q;//这样定义主要是为了以pair的第一个元素排序 for(int i = 1; i <= n+2*m; i++) d[i] = INF; d[s] = 0; Q.push(pair<int,LL>(0,s)); while(!Q.empty()) { int u = Q.top().second; Q.pop(); for(int i = 0; i < gra[u].size(); i++) { int to = (gra[u][i].first); int dist = gra[u][i].second; if(d[to] > d[u] + dist) { d[to] = d[u] + dist; Q.push(pair<int,int>(-d[to],to));//为什么这里我们要-d[to]呢?原因在于优先队列默认从大到小排序,那么-d[to]就得出最小的一定在优先队列的首位 } } }}/** 定义:1~n表示城市编号,n+1~n+m表示群的编号,n+m+1 ~ n+2*m表示群的编号 即有n+i对应的群编号 = n+m+i对应的群编号;*/int main() { scanf("%d%d",&n,&m); int k; for(int i = 1; i <= m; i++) { scanf("%d",&k); for(int j = 0; j < k; j++) { scanf("%d",&a); gra[a].push_back(pair<int,int>(n+i,0));//建立城市到群号之间的距离为0 gra[n+m+i].push_back(pair<int,int>(a,0));//建立群号到城市之间的图 } } scanf("%d",&m1); while(m1--) { scanf("%d%d%lld",&a,&b,&c); gra[a].push_back(pair<int,int>(b,c));//建立城市之间的图 gra[b].push_back(pair<int,int>(a,c)); } scanf("%d",&m2); for(int i = 0; i < m2; ++i) { scanf("%d%d%lld",&a,&b,&c); gra[a+n].push_back(pair<int,int>(b+m+n,c));//建立群与群之间的图 gra[b+n].push_back(pair<int,int>(a+m+n,c)); } scanf("%d%d",&a,&b); if(a == b) { printf("0\n"); return 0; } dijkstra(a); if(d[b] == INF) { printf("-1\n"); } else { printf("%lld\n",d[b]); } return 0;}
当然,优先队列用pair可能不好理解,那么我们可以使用,自定义结构体:
#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <map>#include <vector>#include <cstring>#include <algorithm>#include <set>using namespace std;typedef long long LL;const int max_m = 20010;const LL INF = 0x3f3f3f3f3f3f3f3f;int n,m;int a,b,m1,m2;LL c;vector<pair<int,LL> >gra[3*max_m];LL d[3*max_m];struct HeapNode { int d,u; bool operator < (const HeapNode& rhs) const { return d > rhs.d; }} p,pp;void dijkstra(int s) { priority_queue<HeapNode>Q; for(int i = 1; i <= n+2*m; i++) d[i] = INF; d[s] = 0; p.u = s; p.d = 0; Q.push(p); while(!Q.empty()) { p = Q.top(); Q.pop(); int u = p.u; for(int i = 0; i < gra[u].size(); i++) { int to = (gra[u][i].first); int dist = gra[u][i].second; if(d[to] > d[u] + dist) { d[to] = d[u] + dist; pp.u = to; pp.d = d[to]; Q.push(pp); } } }}int main() { scanf("%d%d",&n,&m); int k; for(int i = 1; i <= m; i++) { scanf("%d",&k); for(int j = 0; j < k; j++) { scanf("%d",&a); gra[a].push_back(pair<int,int>(n+i,0));//建立城市到群号之间的距离为0 gra[n+m+i].push_back(pair<int,int>(a,0));//建立群号到城市之间的图 } } scanf("%d",&m1); while(m1--) { scanf("%d%d%lld",&a,&b,&c); gra[a].push_back(pair<int,int>(b,c));//建立城市之间的图 gra[b].push_back(pair<int,int>(a,c)); } scanf("%d",&m2); for(int i = 0; i < m2; ++i) { scanf("%d%d%lld",&a,&b,&c); gra[a+n].push_back(pair<int,int>(b+m+n,c));//建立群与群之间的图 gra[b+n].push_back(pair<int,int>(a+m+n,c)); } scanf("%d%d",&a,&b); if(a == b) { printf("0\n"); return 0; } dijkstra(a); if(d[b] == INF) { printf("-1\n"); } else { printf("%lld\n",d[b]); } return 0;}
- 2017年计蒜客比赛复赛B D两题
- 搜索比赛D题
- 搜索比赛B题
- 2017 计蒜客复赛 D.百度地图导航
- 计蒜客复赛D题 百度地图导航
- 编程之美挑战赛复赛B题
- 计蒜客复赛B题 Windows 画图
- 2017计蒜客比赛第二场A题B题
- [2017-3-3]BNUZ套题比赛div2 B
- [2017-3-3]BNUZ套题比赛div2 B
- [计蒜之道 复赛2017] 题解 (只有 A,E 两题)
- 2017计蒜客复赛签到题
- 23两两比赛
- 计蒜客-2017 计蒜之道 复赛-B-Windows 画图
- ITAT 第五届c复赛b卷附加题答案
- B - 确定比赛名次
- nyoj 1279 (河南省第九届ACM比赛 D 题)
- 2006百度之星程序设计比赛复赛试题
- Win7系统更新显卡后花屏怎么办?Win7系统更新显卡后花屏怎么办?
- 【SQL工具】SQL调优和诊断神器SQLTXPLAIN (SQLT)简介
- 机器人技术(1)基于ROS的机器人底盘AtdRobot
- 函数分类,HIVE CLI命令,简单函数,聚合函数,集合函数,特殊函数(窗口函数,分析函数,混合函数,UDTF),常用函数Demo
- 文章标题
- 2017年计蒜客比赛复赛B D两题
- MFC多文档框架视图页面添加IE内核浏览器
- Vue实现动态显示textarea剩余字数
- Solr admin管理员界面介绍
- Mysql主从复制配置操作指导(主备)
- 一个不需要cookie与js却能实现类似cookie功能的手段
- 设计模式(Design Pattern)
- ElasticSearch 学习随笔
- DateConverter does not support default String to 'Date' conversion.的处理