NC21315. 农村连接城市
描述
输入描述
第一行输入两个整数n,m (1 ≤ n ≤ 50, 1 ≤ m ≤ 50)
接下来一行输入n个整数cityX[i]表示第i个城市的x坐标
接下来一行输入n个整数cityY[i]表示第i个城市的y坐标
接下来一行输入m个整数villageX[i]表示第i个乡村的x坐标
接下来一行输入m个整数villageY[i]表示第i个乡村的y坐标
所有的点的坐标都是唯一的
所有坐标的值都在0到1000000以内
输出描述
输出一个浮点数,误差在1e-9之内
示例1
输入:
1 2 3 0 3 3 2 1
输出:
2.5
示例2
输入:
4 4 1 4 7 10 5 5 5 5 1 4 7 10 4 4 4 4
输出:
4.0
示例3
输入:
3 3 1 2 3 4 4 4 4 5 6 4 4 4
输出:
4.166666666666667
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 496K, 提交时间: 2023-01-06 20:33:52
#include<bits/stdc++.h> #define x first #define y second #define d(p,q) sqrt(pow(p.x-q.x,2)+pow(p.y-q.y,2)) #define d2(p,q) (pow(p.x-q.x,2)+pow(p.y-q.y,2)) using namespace std; typedef double db; typedef pair<db,db> pdd; typedef tuple<db,db,bool> tdb; pdd w,c[51],v[51]; tdb t[101]; bool cmp(tdb p,tdb q){ pdd a=make_pair(get<0>(p),get<1>(p)),b=make_pair(get<0>(q),get<1>(q)); return d2(w,a)==d2(w,b)?get<2>(p)<get<2>(q):d2(w,a)<d2(w,b); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m; db r=0; cin>>n>>m; for(int i=1;i<=n;i++)cin>>c[i].x; for(int i=1;i<=n;i++)cin>>c[i].y; for(int i=1;i<=m;i++)cin>>v[i].x; for(int i=1;i<=m;i++)cin>>v[i].y; for(int i=1;i<=m;i++){ int s=0; w=v[i]; for(int j=1;j<=n;j++) t[++s]=make_tuple(c[j].x,c[j].y,1); for(int j=1;j<=m;j++) if(i!=j)t[++s]=make_tuple(v[j].x,v[j].y,0); sort(t+1,t+n+m,cmp); for(int j=1;j<n+m;j++){ pdd a=make_pair(get<0>(t[j]),get<1>(t[j])); if(get<2>(t[j])){r+=d(v[i],a)/j; break;} r+=d(v[i],a)/(j*(j+1)); } } cout<<fixed<<setprecision(11)<<r<<endl; return 0; }
C++ 解法, 执行用时: 8ms, 内存消耗: 648K, 提交时间: 2022-05-03 22:36:33
#include <bits/stdc++.h> #define fi first #define se second using namespace std; const int maxn = 100; int n,m; double cx[maxn],vx[maxn],cy[maxn],vy[maxn]; double dis(double x1,double y1,double x2,double y2) { return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } int main() { int n,m; cin>>n>>m; for (int i=1;i<=n;i++) { cin>>cx[i]; } for (int i=1;i<=n;i++) { cin>>cy[i]; } for (int i=1;i<=m;i++) { cin>>vx[i]; } for (int i=1;i<=m;i++) { cin>>vy[i]; } double ans = 0; for (int i=1;i<=m;i++) { vector<pair<double,int>> d; for (int j=1;j<=n;j++) d.push_back({dis(vx[i],vy[i],cx[j],cy[j]),1}); for (int j=1;j<=m;j++) if (j!=i) d.push_back({dis(vx[i],vy[i],vx[j],vy[j]),0}); sort(d.begin(),d.end()); for (int j=0;j<d.size();j++) { if (d[j].se) { ans += d[j].fi/(j+1); break; } else { ans += d[j].fi/((j+2)*(j+1)); } } } printf("%.10f",ans); }