zoukankan      html  css  js  c++  java
  • 算法问题实战策略 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 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    HTML5超科幻个人主页
    用Java开发50个棋类游戏
    Android 4.2 project导入 5.0 SDK Eclipse 开发环境出现的问题总结
    蓝桥杯 地宫寻宝 带缓存的DFS
    HDU2577 How to Type【DP】
    Entity Framework 学习总结之一:ADO.NET 实体框架概述
    ASP.NET MVC4中调用WEB API的四个方法
    ASP.NET MVC Web API 学习笔记---第一个Web API程序
    ASP.Net MVC开发基础学习笔记(1):走向MVC模式
    MVC4笔记 Area区域
  • 原文地址:https://www.cnblogs.com/itdef/p/11918625.html
Copyright © 2011-2022 走看看