1072 Gas Station (30分)

吐血。。。。
做这个题的时候人飘了,题目意思都没读清楚就去写了,导致有一个条件忽略掉了,就是:

If there are more than one solution, output the one with the smallest average distance to all the houses.


也就是说,首先找 最短距离最大者,若相同则选择均值较大者,其次是下标顺序。。。。

附本人AC代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
const int inf = 100000000;
int N, M, K, D, len, t1, t2;
int map[1020][1020], dis[1020];
bool flag[1020];
vector<vector<int>>V;
void dijistra(int x) {
	fill(dis, dis + 1020, inf);
	fill(flag, flag + 1020, false);
	dis[x] = 0;
	for (int i = 1; i <= M + N; i++) {
		int index = -1, mini = inf;
		for (int j = 1; j <= N + M ; j++) {
			if (flag[j] == false && dis[j] < mini) {
				mini = dis[j];
				index = j;
			}
		}
		if (index == -1)return;
		flag[index] = true;
		for (int j = 1; j <= N + M; j++) {
			if(flag[j]==false&&map[index][j] != inf) {
				if (dis[j] > dis[index] + map[index][j]) {
					dis[j] = dis[index] + map[index][j];
				}
			}
		}
	}
}
int main() {
	fill(map[0], map[0] + 1020 * 1020, inf);
	string s1, s2;
	scanf("%d%d%d%d", &N, &M, &K, &D);
	V.resize(N + M + 1);
	for (int i = 0; i < K; i++) {
		cin.ignore();
		cin >> s1 >> s2;
		scanf("%d", &len);
		if (s1[0] == 'G')t1 = N + stoi(s1.substr(1));
		else t1 = stoi(s1);
		if (s2[0] == 'G')t2 = N + stoi(s2.substr(1));
		else t2 = stoi(s2);
		map[t1][t2] = map[t2][t1] = len;
	}
	int index, fsum = -1, fmini = -1;
	for (int i = N + 1; i <= N + M; i++) {
		dijistra(i);
		int sum = 0, mini = D + 1, tflag = 0;
		for (int j = 1; j <= N; j++) {
			if (dis[j] > D) {
				tflag = 1;
				break;
			}
			sum += dis[j];
			if (dis[j] < mini)mini = dis[j];
		}
		if (tflag == 1)continue;
		if (mini == D + 1)continue;
		if (mini > fmini) {
			fsum = sum;
			index = i;
			fmini = mini;
		}
		else if (mini == fmini && sum < fsum) {
			fsum = sum;
			index = i;
		}
	}
	if (fmini == -1)printf("No Solution\n");
	else printf("G%d\n%.1lf %.1lf", index - N, (double)fmini, (double)fsum / N);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值