1. 程式人生 > >hdu6071 2017hdu多校第四場

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 子矩陣求和

2017HDU9

題目連結 一些題解 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 --20161010

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個數,然後我們要求出現次數最多並且最大的, 也就是如果出現次數最多的有多個,那就必須刪除其他的數,避免出現次數最大的有多個,然後我們要求值最大,所以我們還要儘量判斷值大的  題目思路: 首先我們先明確我們要取什麼數:

20174 HDU 6078 Wavel Sequence DP

bsp wav hdu pac i++ size 個數 style mem 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 題意:求兩個序列的公共波形子序列的個數。 解法: 類似於最長公共上升子序列,對於每個i,只考慮

20157 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),要求

20164 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巨提醒,才知道可以用

20177 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位置對每個位置的貢獻打表發現 第一次 貢

20179 HDU 6170 Two strings DP

ems str php hdu 鏈接 兩種 namespace turn bit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 題意:給了2個字符串,其中第2個字符串包含.和*兩種特別字符,問第二個字符串能否和第一個

20179 HDU 6166 Senior Pan 堆優化Dij

step log push 隨機 我們 spa lld 做的 http 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 題意:給你一個有向圖,然後給你k個點,求其中一個點到另一個點的距離的最小值。 解法:枚舉二進制位按