20分代码求助,题给数据和自己设置的数据都没问题,不知道错误原因,求助大佬
查看原帖
20分代码求助,题给数据和自己设置的数据都没问题,不知道错误原因,求助大佬
1075350
2023110918_Luoqiushi楼主2023/10/11 21:03
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>

long a[500] = { 0 };
long b[500] = { 0 };
bool relate[500][500] = { 0 };
long pi[500] = { 0 };
long f1[500] = { 0 };
long f2[500] = { 0 };\\用long是之前排错的时候设置的,好像没太大影响
int n, m;
bool pan1(int k)
{
	for (int i = 1; i <= n; ++i)
	{
		if (k == pi[i])
		{
			return 0;
		}
	}
	return 1;
}\\判断该点是否被拆除
bool pan(int k)
{
	int y = 0;
	for (int i = 1; i <= n; ++i)
	{
		if (relate[k][i] == 1 || relate[i][k] == 1)
		{
			++y;
		}
	}
	if (y >= 2)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}\\判断该点连接了几个点,如果>=两个,则不能拆除,如果只有一个则拆除
int maxbi()
{
	double a1, a2;
	int y, a3;
	a3 = 0;
	for (int i = 1; i <= n; ++i)
	{
		if (pan1(i) && pan(i))
		{
			a1 = (float)a[i] / b[i];
			a3 = i;
			break;
		}
	}
	for (int i = 1; i <= n; ++i)
	{
		a2 = (float)a[i] / b[i];

		if (a1 >= a2 && pan(i) && pan1(i))
		{
			a1 = a2;
			a3 = i;
		}
	}
	return a3;
}\\寻找 总产量/总污染 最小的点
int main()
{
	int i1 = 0, i2 = 0, max1;
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		f1[0] = f1[0] + a[i];
	}
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", &b[i]);
		f2[0] = f2[0] + b[i];
	}
	for (int i = 1; i <= n - 1; ++i)
	{
		scanf("%d %d", &i1, &i2);
		relate[i1][i2] = 1;
	}\\输入数据
	for (int i = 1; i <= m; ++i)
	{
		max1 = maxbi();
		f1[i] = f1[i - 1] - a[max1];
		f2[i] = f2[i - 1] - b[max1];\\状态转移方程
		a[max1] = 0;
		pi[i] = max1;
		for (int j = 1; j <= n; ++j)
		{
			relate[j][max1] = relate[max1][j] = 0;\\拆除的点的连接归零
		}
	}
	printf("%0.1f", (float)f1[m] / f2[m]);\\输出 总产量/总污染
}```
2023/10/11 21:03
加载中...