1. 程式人生 > >2017多校訓練賽第四場 HDU 6071(最短路)

2017多校訓練賽第四場 HDU 6071(最短路)

Lazy Running

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 101    Accepted Submission(s): 40

Problem Description

In HDU, you have to run along the campus for 24 times, or you will fail in PE. According to the rule, you must keep your speed, and your running distance should not be less thanK

meters.
There are 4 checkpoints in the campus, indexed as p1,p2,p3 and p4. Every time you pass a checkpoint, you should swipe your card, then the distance between this checkpoint and the last checkpoint you passed will be added to your total distance.
The system regards these 4 checkpoints as a circle. When you are at checkpoint p
i, you can just run to pi−1 or pi+1(p1 is also next to p4). You can run more distance between two adjacent checkpoints, but only the distance saved at the system will be counted.
 



Checkpoint p2 is the nearest to the dormitory, Little Q always starts and ends running at this checkpoint. Please write a program to help Little Q find the shortest path whose total distance is not less thanK

.

Input

The first line of the input contains an integer T(1≤T≤15), denoting the number of test cases.
In each test case, there are 5 integers K,d1,2,d2,3,d3,4,d4,1(1≤K≤1018,1≤d≤30000), denoting the required distance and the distance between every two adjacent checkpoints.

Output

For each test case, print a single line containing an integer, denoting the minimum distance.

Sample Input

1 2000 600 650 535 380

Sample Output

2165

Hint

The best path is 2-1-4-3-2.

Source

        比賽的時候就是蠢……

        當時只剩下十幾分鐘的時候看到這題的……其實很簡單的一道最短路,前提是想到了……

        題目要求是隻有四個點,然後連邊成正方形,問從2號點出發,再回到2號點且走過的總距離大於K的最短的路徑是多少。對於這個,我們考慮如果存在一條合法路徑,那麼我再走2*w也一定是合法路徑,其中w表示與2相連的某條邊的長度。即回到2之後再出去再回來,這樣的路徑一定合法。那麼,如果走了某條路徑回到了2,然後總距離不夠的話,我們只需要加上幾個2*w使得最後結果大於等於K即可。

        那麼如何使這個結果最小呢?我們考慮設定一個數組d[x][p]表示從2出發最後到達x點且費用對2*w取模結果為p時的最小花費。這樣子原本的一個點就可以拆成2*w個點,這樣跑一遍dijkstra即可求出d陣列。之後,對於每一個對2*w取模後的數值,我們都可以計算把它補到大於K且距離K最近的花費,再在這些花費中取一個最小的即可。那麼,這樣子考慮為什麼可以包含全部的而且最優的解呢?因為我們最後補的是2*w或者它的倍數,然後我把對2*w取模後的所有取值的最小花費都計算了一次,這樣子得出來的最小花費一定包含所有的情況,即2*w的所有剩餘系都被包括了,所以可以保證正確性。具體程式碼如下:

#include<bits/stdc++.h>
#define LL long long
using namespace std;

struct Edge{int y;LL w;};
typedef pair<LL,int> P;
vector<Edge> g[4];
LL d[4][100000],K,m;
int n,s;

inline void dijkstra(int s)
{
    priority_queue<P,vector<P>,greater<P> > q;
    for(int i=0;i<n;i++)
        for(int j=0;j<=m;j++)
            d[i][j]=2000000000000000000;
    q.push(P(0LL,s));							//d[s][0]不能賦值為0
    while (!q.empty())
    {
        LL w=q.top().first;
        int j=q.top().second;
        q.pop();
        if (w>d[j][w%m]) continue;
        for(int k=0;k<g[j].size();k++)
        {
            int y=g[j][k].y;
            LL dist=w+g[j][k].w;
            if (d[y][dist%m]>dist)					//更新的時候更新取模後對應的點
            {
                d[y][dist%m]=dist;
                q.push(P(dist,y));
            }
        }
    }
}

int main()
{
    n=4;
    s=1;
    int T_T;
    cin>>T_T;
    while(T_T--)
    {
        int d1,d2,d3,d4;
        memset(g,0,sizeof(g));
        scanf("%I64d%d%d%d%d",&K,&d1,&d2,&d3,&d4);
        g[0].push_back(Edge{1,d1});
        g[1].push_back(Edge{0,d1});
        g[1].push_back(Edge{2,d2});
        g[2].push_back(Edge{1,d2});
        g[2].push_back(Edge{3,d3});
        g[3].push_back(Edge{2,d3});
        g[3].push_back(Edge{0,d4});
        g[0].push_back(Edge{3,d4});
        m=2*min(d1,d2);							//為了使效率更高,w取兩條與2相連的邊中小的那個
        dijkstra(s);
        LL ans=2000000000000000000;
        int p;
        for(int i=0;i<m;i++)						//列舉剩餘系下所有的可能的最小花費
        {
            LL delta=K-d[1][i];
            if (delta<=0) ans=min(ans,d[1][i]);
            else ans=min(ans,d[1][i]+delta/m*m+(delta%m>0)*m);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

相關推薦

2017訓練 HDU 6071短路

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 101    Accepted S

2017訓練 HDU 6162LCA+Treap解法

Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1091    Accepted Submi

2017訓練 HDU 6170 Two Stringdp

Two strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1723    Accepted Sub

2018-2019賽季聯合新生訓練(2018/12/9)補題題解

感慨 這次難度有了明顯的上升啊。。。中間一些題也是挺賤的 A 數一數(思維) 實際上根據觀察一個奇數對應一個偶數是一張正反面,那麼給定兩個區間是不是可以直接列舉呢? 解法 ①列舉,如果中間的數有等於偶數的那麼頁數加一 ②輸出,如果第一頁是奇數那麼頁數再加一否則直接輸出 程式碼 #include

2018-2019賽季聯合新生訓練題解與補題

這一場比賽我是在宿舍裡打的,環境非常的惡劣(噓) 因為舍友一直在說話啥的 不過這也是沒辦法的事,畢竟是週末嘛~ 上來第一題就給我嚇破膽了 ,嚇得我拿了一個本子在那個地方瘋狂計算,把每種情況都寫出來以後才敢開始coding 後來提交發現已經好多人a了這道題,挺不應該的 還有一個要注意的是,千萬

2018-2019賽季聯合新生訓練

問題 A: 數一數時間限制: 1 Sec 記憶體限制: 128 MB 題目描述 星期天早上,小明開始做數學家庭作業。因為小明成績很優異,覺得題目太簡單了,思考出道難點的數學題去學校考考同學,他注意到:數學書的第10頁和第11頁在同一張紙上,但第11頁和第12頁不在同一張紙上。 哈哈,題目有了

2017訓練第一 HDU 6042 母函式

Journey with Knapsack Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 164    A

2017訓練第一 HDU 6039 Gear Up線段樹+並查集

Gear Up Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 59    Accepted Submiss

HDU 6340 2018HDU Delightful Formulas莫比烏斯反演+伯努利數+NTT+積性

大致題意:給你k和m,還有n分解質因子之後的質因子及其對應的指數,讓你求 。 首先,這種含有gcd的式子,第一步肯定是進行莫比烏斯反演,這裡由於前面好幾篇都由類似的反演形式,所以我就不展開了,直接就得出反演之後的結果:              

NOIP 2018訓練

正題      A. 求和        給一個 n 行 t 列的矩陣,矩陣第 i 行第 j 列的元素是 i+j。      &nbs

HDU-2017 訓練1-補題

ACM模版 比賽不是特別順利,第一次打多校,感覺還是英語問題很大,雖然編碼水平也很渣……比賽時做了四道,有些心痛了。賽後補補題吧,先將賽中的四道題寫一下,佔佔流量,然後慢慢新增補的題吧! 1001-Add More Zero 描述 題解

HDU-2017 訓練8-補題

ACM模版 今天的比賽真讓我難受,題目辣麼長,開始二十分鐘後竟然 0A0A,儼然讓我感覺自己這次要爆零,搞了倆小時依然無果,好在沒有放棄,總算是幹掉了第 1111 題,然後又成功水過第 0808 題,有些出乎我的意料了,但是好在我還是堅持到了最後,儘管止步於兩

HDU 6043 2017 訓練1 1002 Balala Power!

Talented Mr.Tang has n strings consisting of only lower case characters. He wants to charge them with Balala Power (he could change each character rang

HDU 6038 (2017 訓練1 1006 Function(圖論)

You are given a permutation a from 0 to n−1 and a permutation b from 0 to m−1. Define that the domain of function f is the set of integers from 0 to n−1

HDU-2017 訓練5-1006-Rikka with Graph

ACM模版 描述 題解 這個題看著很複雜,程式碼卻是十分簡單,直接看程式碼吧,不是特別難。幾個判斷就能搞定了…… 程式碼 #include <iostream> us

【noip模擬1】古韻之鵲橋相會短路

tle ++ 古今 表示 put 好的 天下 jks out 描述 迢迢牽牛星,皎皎河漢女。 纖纖擢素手,劄劄弄機杼; 終日不成章,泣涕零如雨。 河漢清且淺,相去復幾許? 盈盈一水間,脈脈不得語。 ——《古詩十九首》 傳說,上古時

HDU 5371 2015聯合訓練1003Hotaru&#39;s problem(manacher+二分/枚舉)

2015多校 while bre 算法 down ice man 暴力 turn pid=5371">HDU 5371 題意: 定義一個序列為N序列:這個序列按分作三部分,第一部分與第三部分同樣,第一部分與第二部分對稱。 如今給你一個長為n(n

2018-2019賽季聯合新生訓練(2018/12/8)補題題解

感慨 得複習回溯和dfs了。。。 A 變形蟲(語法基礎) 程式碼 #include <bits/stdc++.h> using namespace std; map<int,int> num; int main() { ios::sync_with_stdio(0);

Contest1593 - 2018-2019賽季聯合新生訓練部分題解

H 10255 自然數無序拆分   H 傳送門 題幹: 題目描述 美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。 可是這道題

2018-2019賽季聯合新生訓練題解和補題

本次成績 第44名(銅牌) 雖然都是銅牌,但是這次比上次強多了2333 這次感覺水題比較多啊,但是還是有幾個不會做的,你們懂那種使勁做一道兩道題就是做不出來的感覺嗎!!!簡直要死,這次比賽和上次比賽間隔太短了,可能導致用腦過度了(滑稽)下面開始我們愉快的題解和補題環節吧!(要是我英語演講能這