算法问题实战策略 NTHLON
地址 https://algospot.com/judge/problem/read/NTHLON

1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <queue> 5 6 7 using namespace std; 8 9 int V; 10 //图的邻接表表示法 保存成对(连接的顶点序号 边线加权值) 11 vector<pair<int, int>> adj[410]; 12 const int START = 401; 13 const int INF = 0x3f3f3f3f; 14 15 16 vector<int> dijkstra(int src) 17 { 18 vector<int > dist(V, INF); 19 dist[src] = 0; 20 priority_queue<pair<int, int>> pq; 21 pq.push(make_pair(0, src)); 22 23 while (!pq.empty()) { 24 int cost = -pq.top().first; 25 int here = pq.top().second; 26 pq.pop(); 27 28 if (dist[here] < cost) continue; 29 30 for (int i = 0; i < adj[here].size(); ++i) { 31 int there = adj[here][i].first; 32 int nextDist = cost + adj[here][i].second; 33 34 if (dist[there] > nextDist) { 35 dist[there] = nextDist; 36 pq.push(make_pair(-nextDist, there)); 37 } 38 } 39 } 40 41 return dist; 42 } 43 44 //========================================================== 45 46 //返回(A国选手的预想耗时-B国家选手的预想耗时)的顶点序号 47 int vertex(int delta) { 48 return delta + 200; 49 } 50 51 //a[]=A国选手的各项预想耗时 52 //b[]=B国选手的各项预想耗时 53 int solve(const vector<int>& a, const vector<int>& b) { 54 //生成图结构 55 V = 402; 56 for (int i = 0; i < V; i++) adj[i].clear(); 57 for (int i = 0; i < a.size(); i++) { 58 int delta = a[i] - b[i]; 59 adj[START].push_back(make_pair(vertex(delta), a[i])); 60 } 61 62 //当前耗时之差 63 for (int delta = -200; delta <= 200; ++delta) { 64 //若添加第i个比赛项目 65 for (int i = 0; i < a.size(); ++i) { 66 int next = delta + a[i] - b[i]; 67 //没有必要生成耗时之差超过200的顶点 68 if (abs(next) > 200) continue; 69 adj[vertex(delta)].push_back(make_pair(vertex(next), a[i])); 70 } 71 } 72 73 vector<int> shortest = dijkstra(START); 74 int ret = shortest[vertex(0)]; 75 if (ret == INF) return -1; 76 return ret; 77 } 78 79 80 81 82 83 int main() 84 { 85 int n,m; 86 cin >> n; 87 while (n--) { 88 cin >> m; 89 vector<int> va; 90 vector<int> vb; 91 for (int i = 0; i < m; i++) { 92 int a, b; 93 cin >> a >> b; 94 va.push_back(a); 95 vb.push_back(b); 96 } 97 int ret = solve(va, vb); 98 if (ret != -1) { 99 cout << ret << endl; 100 } 101 else { 102 cout << "IMPOSSIBLE" << endl; 103 } 104 } 105 106 107 return 0; 108 }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话