Submission #1339154

#TimeUsernameProblemLanguageResultExecution timeMemory
1339154settopAncient Books (IOI17_books)C++20
0 / 100
2065 ms916428 KiB
#include "books.h"
#include<bits/stdc++.h>

using namespace std;

#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
typedef tuple<int,vector<int>,int> trio;

map<vector<int>,map<int,int>> dp;

long long minimum_walk(std::vector<int> p, int s){
	int n=sz(p); vector<int> reg(n); iota(all(reg),0);

	dp[reg][0]=1; 
    priority_queue<trio> fila; fila.push({1,reg,0});
    while(!fila.empty()){
        auto [d,v,id]=fila.top(); fila.pop();
        if(d!=dp[v][id]) continue;
        fall(i,0,n-1)
            fall(j,0,n-1){
                auto aux=v; aux[i]=j;
                int cost=abs(i-id)+abs(j-i);
                if(dp[aux][j]>dp[v][id]+cost || dp[aux][j]==0){
                    dp[aux][j]=dp[v][id]+cost;
                    fila.push({dp[aux][j],aux,j});
                }
            }
    }
    int ans=1000;
	fall(i,0,n-1) reg[i]=p[i];
    fall(i,0,n-1) ans=min(ans,dp[reg][i]+i);
    cout<<ans-1<<"\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...