hdu6071 2017hdu多校第四場
這道題題意也是很簡單,給出一個4個點的無向圖,組成了一個環路
從2點出發,隨便跑,然後再從2點結束,問怎麼個跑法讓距離總和在超過k的前提下最短。
一步一步來想這道題,瞎幾把暴力深搜可以出答案啊。
當然複雜度很高,那加個記憶化搜尋,dp[4][k+30000],dp[i][j]表示的是從2開始出發來到i那個點,距離有沒有距離為j的走法,有就true,沒有就false,當深搜的時候遇到已經true了,那可以不用進行下去,優秀了很多。但是dp根本開不來那麼大的,k去到1e18了。空間爆炸,並且也沒有利用到題目中一個很重要的特點,這個圖其實可以看成每個點自己本身帶了一個自環,比如2點可以去到1點,然後1點回來2點,也就是2點本身有一個長度為2*d12的自環,同理有還有一個2*d23的自環,這個怎麼用呢?
先在記憶化搜尋的基礎上考慮這麼一個問題,如果d12長度是5,然後記憶化深搜的過程中,找到dp[i][4]=true,dp[i][14]=true,就是說到達從2到達i點可以走4長度或者14長度,其實我們可以只保留那個小的值就足夠了,為什麼,因為14長度的其實可以由4長度的,加上2-1-2這樣往返跑一輪得到14,同理24,34,44……這些也都沒必要去記錄了。所以dp可以縮減為dp[4][d12的長度*2],把深搜走的距離長度dis%(d12的長度*2),對應到dp中,dp存dis的最小值,只要有了這個最小值,就能加上往返跑的方法跑出其他值來,這樣就達到了節約空間時間的複雜度,因為那些很多狀態其實都是一樣的。往返跑的邊可以選d12或者d23,都可以,區別是dp陣列的大小不同
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e4+10;
const long long INF = 1e19;
int d[5][5];
long long dp[5][MAXN*2];
struct Dis
{
int u,d;
friend bool operator < (const Dis &a,const Dis &b)
{
return a.d>b.d;
}
};
long long dfs(long long k)
{
for (int i=1;i<=4;i++)
fill(dp[i],dp[i]+MAXN*2,INF);
dp[2][0]=0;
int m=min(d[1][2],d[2][3])*2;
priority_queue<Dis> que;
que.push({2,0});
while(que.size())
{
Dis top=que.top();que.pop();
int u=top.u;
for(int v=1;v<=4;v++)
{
if(d[u][v])
{
long long dis=top.d+d[u][v];
if(dp[v][dis%m]>dis)
{
dp[v][dis%m]=dis;
que.push({v,dis});
}
}
}
}
long long ans=INF;
for(int i=0;i<m;i++)
{
if(dp[2][i]==INF) continue;
long long dis;
if(dp[2][i]>k)
dis=dp[2][i];
else
dis=(k-dp[2][i])/m*m+dp[2][i];
while(dis<k) dis+=m;
ans=min(dis,ans);
}
return ans;
}
int main()
{
if (fopen("in.txt", "r") != NULL)
{
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
}
int t;
cin>>t;
while(t--)
{
long long int k;
cin>>k>>d[1][2]>>d[2][3]>>d[3][4]>>d[4][1];
d[2][1]=d[1][2];
d[3][2]=d[2][3];
d[4][3]=d[3][4];
d[1][4]=d[4][1];
cout<<dfs(k)<<'\n';
}
return 0;
}
相關推薦
hdu6071 2017hdu多校第四場
這道題題意也是很簡單,給出一個4個點的無向圖,組成了一個環路 從2點出發,隨便跑,然後再從2點結束,問怎麼個跑法讓距離總和在超過k的前提下最短。 一步一步來想這道題,瞎幾把暴力深搜可以出答案啊。 當然複雜度很高,那加個記憶化搜尋,dp[4][k+300
牛客多校第四場 G Maximum Mode
clas pear contain 記錄 The 但是 -m out appear 鏈接:https://www.nowcoder.com/acm/contest/142/G來源:牛客網 The mode of an integer sequence is the valu
杭電2018多校第四場(2018 Multi-University Training Contest 4) 1004.Problem D. Nothing is Impossible (HDU6335) -思維題
假設 spa 。。 lan 多校 () class span tdi 6335.Problem D. Nothing is Impossible 題意:給你n道題目,m個人,每題有x個正確選項,y個錯誤選項,問你做對題數量最多的人做對了多少道題目。 如果一道題有
杭電2018多校第四場(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -子矩陣求和-規律+二維前綴和
main turn 輸出 求和 targe blog 技術分享 tle pre 6336.Problem E. Matrix from Arrays 不想解釋了,直接官方題解: 隊友寫了博客,我是水的他的代碼 ------>HDU 6336 子矩陣求和
2017HDU多校第9場
題目連結 一些題解 02 Ch’s gift 題目意思是給定一顆有n個節點的樹,和點的點權。有m次查詢,每次查詢範圍在x節點到y節點之間,當沿最短路徑走經過的點權在a - b的範圍內的時候,最終結果就加上這個點權。 那麼做過LCA
牛客多校第四場A ternary string ----推公式和指數迴圈節
Ternary String 時間限制:C/C++ 4秒,其他語言8秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 A ternary string is a sequenc
hdu5773 --2016多校第四場1010
The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1097 Ac
牛客多校第四場 J Hash Function(拓撲排序 + 線段樹建邊)
題目描述 Chiaki has just learned hash in today's lesson. A hash function is any function that can be used to map data of arbitrary size to
2018牛客多校第四場 A Ternary String
設dp[i]為刪掉原本的第i位需要經過多少天,然後可以根據規則發現一些規律,如果第i位是2的話,dp[i]=6*2^dp[i-1]-3,如果是第1位的話就是dp[i]=2^dp[i-1]+2,0:dp[i]=dp[i-1]+1,然而dp陣列是非常大的,需要對mod進行取模,但
多校第四場一二題
A Olympiad http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85242#problem/A 水題,預處理F【i] B Problem Killer http://acm.hust.edu.cn/vjudge/co
HDU6069多校第四場 Counting Divisors
10 48 2302題意: 對l~r中的每個數的因子個數求和(最後求餘);思路: 對於每一個數而言可以進行分解質因數 num=p1^k1*p2^k2……pn^kn 的形式,而當前這個數的因子和(可以整除這個數的數)就是(k1+1)*(k2+1)……*(kn+1)個。而現在題中求i^k,分解質因子中將k乘
2012多校第四場總結
本場比賽我發揮的還算正常,貢獻了三個題: 一個線段樹、一個雜湊題、一個期望DP 大一的牛哥貢獻了一個矩陣乘法的題目,這個題A的人還蠻少的,贊一個,總共四個,還好,總算也進了第一版 但是,另有兩個幾十個
牛客多校第四場G Maximum Mode(模擬)
題目大意: 給出一個n個數的序列,我們可以刪除m個數,然後我們要求出現次數最多並且最大的, 也就是如果出現次數最多的有多個,那就必須刪除其他的數,避免出現次數最大的有多個,然後我們要求值最大,所以我們還要儘量判斷值大的 題目思路: 首先我們先明確我們要取什麼數:
2017多校第4場 HDU 6078 Wavel Sequence DP
bsp wav hdu pac i++ size 個數 style mem 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 題意:求兩個序列的公共波形子序列的個數。 解法: 類似於最長公共上升子序列,對於每個i,只考慮
2015多校第7場 HDU 5379 Mahjong tree 構造,DFS
print () name long scanf 2015多校 printf color tree 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 題意:一顆n個節點n-1條邊的樹,現在要給每個節點標號(1~n),要求
2016多校第4場 HDU 6076 Security Check DP,思維
pro begin sizeof || i++ 預處理 通過 第一個 ans 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 題意:現要檢查兩條隊伍,有兩種方式,一種是從兩條隊伍中任選一條檢查一個人,第二種是在每條隊伍
hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五場 1004) 【組合數學 + 數論 + 模意義下的FFT】
i++ put c擴展 notice const pri 得到 處理 質數 題目鏈接 首先利用組合數學知識,枚舉兩人的總勝場數容易得到 這還不是卷積的形式,直接搞的話復雜度大概是O(n^2)的,肯定會TLE。但似乎和卷積有點像?想半天沒想出來。。多謝Q巨提醒,才知道可以用
2017多校第7場 HDU 6129 Just do it 找規律
ble nbsp bool name def ons spa esp bre 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 題意:求a序列後m次xor前綴和 解法: 手動對1位置對每個位置的貢獻打表發現 第一次 貢
2017多校第9場 HDU 6170 Two strings DP
ems str php hdu 鏈接 兩種 namespace turn bit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 題意:給了2個字符串,其中第2個字符串包含.和*兩種特別字符,問第二個字符串能否和第一個
2017多校第9場 HDU 6166 Senior Pan 堆優化Dij
step log push 隨機 我們 spa lld 做的 http 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 題意:給你一個有向圖,然後給你k個點,求其中一個點到另一個點的距離的最小值。 解法:枚舉二進制位按