列表

详情


NC21315. 农村连接城市

描述

平面上有N个城市和M个乡村,一开始没有任何的道路
为了改善这个局面,主席决定采取一些策略使得每个乡村都能连接到至少一个城市
当存在一个乡村与任何城市都没有联系时,执行如下操作
1:随机挑选一个未联系的乡村V
2:选择离V最近(欧几里得距离)的一个已链接城市的乡村或者城市,如果有多个,满足条件的点,随机选择,假设选择的点为P
3:在V与P之间 建设一条道路

求期望需要修建多长的道路能使得所有的乡村都能直接或者间接的连接到城市

输入描述

第一行输入两个整数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);
}

上一题