結果
| 問題 | No.463 魔法使いのすごろく🎲 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-09-04 13:36:57 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 19 ms / 2,000 ms |
| コード長 | 2,391 bytes |
| コンパイル時間 | 1,921 ms |
| コンパイル使用メモリ | 203,176 KB |
| 最終ジャッジ日時 | 2025-02-07 02:36:35 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#define rep(i,n) for(ll i=0;i<n;i++)
#define repl(i,l,r) for(ll i=(l);i<(r);i++)
#define per(i,n) for(ll i=(n)-1;i>=0;i--)
#define perl(i,r,l) for(ll i=r-1;i>=l;i--)
#define fi first
#define se second
#define ins insert
#define pqueue(x) priority_queue<x,vector<x>,greater<x>>
#define all(x) (x).begin(),(x).end()
#define CST(x) cout<<fixed<<setprecision(x)
#define rev(x) reverse(x);
using ll=long long;
using vl=vector<ll>;
using vvl=vector<vector<ll>>;
using pl=pair<ll,ll>;
using vpl=vector<pl>;
using vvpl=vector<vpl>;
const ll MOD=1000000007;
const ll MOD9=998244353;
const int inf=1e9+10;
const ll INF=4e18;
const ll dy[9]={1,0,-1,0,1,1,-1,-1,0};
const ll dx[9]={0,1,0,-1,1,-1,1,-1,0};
template <typename T> inline bool chmax(T &a, T b) {
return ((a < b) ? (a = b, true) : (false));
}
template <typename T> inline bool chmin(T &a, T b) {
return ((a > b) ? (a = b, true) : (false));
}
vector<double> gauss_jordan(const vector<vector<double>> &A,const vector<double> &b){
int n=A.size();
vector<vector<double>> B(n,vector<double>(n+1));
rep(i,n){
rep(j,n)B[i][j]=A[i][j];
}
rep(i,n)B[i][n]=b[i];
rep(i,n){
int pivot=i;//係数が0になることを防ぐ
for(int j=i;j<n;j++){
if(abs(B[j][i])>abs(B[pivot][i]))pivot=j;
}
swap(B[i],B[pivot]);
for(int j=i+1;j<=n;j++)B[i][j]/=B[i][i];
rep(j,n){
if(i!=j){
for(int k=i+1;k<=n;k++)B[j][k]-=B[j][i]*B[i][k];
}
}
}
vector<double> x(n);
rep(i,n)x[i]=B[i][n];
return x;
}
int main(){
ll n,m;cin >> n >> m;
using vd=vector<double>;
vd c(n);
for(ll i=1;i<n-1;i++)cin >> c[i];
vector<vd> mat(n,vd(n));
vd b(n);
rep(i,n-1){
mat[i][i]-=1;
double sum=0;
rep(_,m){
ll to=i+_+1;
if(to>n-1){
ll f=to-(n-1);
to-=f*2;
}
mat[i][to]+=1.0/m;
sum+=c[to];
}
b[i]=-sum/m;
}
mat[n-1][n-1]=1;b[n-1]=0;
auto f=gauss_jordan(mat,b);
CST(10);
//rep(i,n)cout << f[i] << endl;
vd dp(n,INF);dp[n-1]=0;
per(i,n-1){
if(i+m>=n-1){
dp[i]=0;continue;
}
double sum=0;
double mx=INF;
for(ll j=i+1;j<=i+m;j++){
sum+=dp[j]+c[j];
chmin(mx,f[j]+c[j]);
}
dp[i]=min(sum/m,mx);
}
cout << dp[0] << endl;
}