日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

FJOI2018邮递员问题

發布時間:2023/12/13 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 FJOI2018邮递员问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DP分類討論,狀態定義


街道可以亂竄,起點終點確定,求遍歷所有點的最短路徑

感覺好難,只會10分

網絡流暴力30分

哎~

做題要多思考,不要看題解,也不要看了題解就完了,還有很多做法

SOL:

參考自yyb

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+4;
int n[2],ty[2],pos[2];
double h,tx[2],a[2][N],f[N][2];
inline double dis(int i,int j){
	static double d;
	d=fabs(a[0][i]-a[1][j]);
	return sqrt(d*d+h*h);
} 
inline double toend(int i,int j){
	static double d;
	d=fabs(a[i][j]-tx[1]);
	return i==ty[1]?d:sqrt(h*h+d*d);
}
inline double solve(){
	double ret=1e18;
	sort(a[0],a[0]+n[0]+1);
	sort(a[1],a[1]+n[1]+1);
	for(int i=n[0];i;--i){//0->(i,j+1) 1->(i+1,j)
		if(i==n[0])for(int j=n[1];j;--j){
			f[j][0]=(j==n[1]?toend(0,n[0]):min(f[j+1][1]+dis(i,j+1),dis(i,n[1])+a[1][n[1]]-a[1][j+1]+toend(1,j+1)));
			f[j][1]=(j==n[1]?toend(1,n[1]):f[j+1][1]+a[1][j+1]-a[1][j]);
		}//
		else for(int j=n[1];j;--j)
			if(j==n[1]){
				f[j][1]=min(f[j][0]+dis(i+1,j),dis(n[0],n[1])+a[0][n[0]]-a[0][i+1]+toend(0,i+1));
				f[j][0]+=a[0][i+1]-a[0][i];
			}
			else{
				f[j][1]=min(f[j][0]+dis(i+1,j),f[j+1][1]+a[1][j+1]-a[1][j]);
				f[j][0]=min(f[j+1][1]+dis(i,j+1),f[j][0]+a[0][i+1]-a[0][i]);
			}
		ret=min(ret,a[0][i]-a[0][1]+tx[0]-a[0][1]+dis(i,1)+f[1][1]);
		ret=min(ret,fabs(a[0][i]-tx[0])+a[0][i]-a[0][1]+dis(1,1)+f[1][1]);
		if(a[0][i]<=tx[0]){
			ret=min(ret,tx[0]-a[0][1]+dis(1,1)+f[1][1]);
			break;
		}
	}
	return ret; 
}
int main(){
	scanf("%d%d%d%d%d%d%lf",&n[0],&n[1],&ty[0],&pos[0],&ty[1],&pos[1],&h);
	int r=0;
	if(ty[0]){r=1;swap(n[0],n[1]);ty[0]^=1;ty[1]^=1;}
	for(int t=0;t^2;++t)
		for(int i=1;i<=n[t^r];++i)
			scanf("%lf",&a[t^r][i]);
	tx[0]=a[ty[0]][pos[0]];
	tx[1]=a[ty[1]][pos[1]];
	double ans=solve();
	for(int t=0;t^2;++t)
		for(int i=1;i<=n[t];i++)
			a[t][i]=20000-a[t][i];
	tx[0]=20000-tx[0];
	tx[1]=20000-tx[1];
	ans=min(ans,solve());
	printf("%.2lf",ans);
	return (0-0);
}

總結

以上是生活随笔為你收集整理的FJOI2018邮递员问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。