社区讨论

球球帮看代码,这个输出结果一直是0,不明白啊!!

P1873[COCI 2011/2012 #5] EKO / 砍树参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m3whvx9b
此快照首次捕获于
2024/11/25 11:55
去年
此快照最后确认于
2025/11/04 13:57
4 个月前
查看原帖
球球帮看代码,这个输出结果一直是0,不明白啊!!
CPP
#include <iostream>
using namespace std;
//二分答案:
//1、范围:high【1,maxn】
//2、单调性:high越低,锯出来的木材越多
//3、函数判断:是否该高度下句出来的长度大于M需求的总长度
int IsHighEnough(int high, int *arr, int M, int N)
{
	int num = 0;
	for (int i = 0; i < N; i++)
	{
		if (arr[i] >= high)
		{
			num += (arr[i] - high);
		}
	}
	cout << "Height: " << high << ", Total Wood: " << num << endl;
	if (num >= M) return 1;
	else return 0;

}

long long N, M; //树木数量,需要的木材总长度

int main()
{
	
	cin >> N >> M;
	int* arr = new int[N];

	int high = 0; //设定的锯片高度
	int maxn = 0;

	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
		if (arr[i] >= maxn)
			maxn = arr[i];
	}
	
	int left = 0, right = maxn;
	int mid;

	while (left <= right)
	{
		mid = left + (right - left) / 2;
		// 添加调试信息
		cout << "Left: " << left << ", Mid: " << mid << ", Right: " << right << ", Result: " << high << endl;
		if (IsHighEnough(mid, arr, M, N)) //长度>=M
		{
			right = mid - 1;
			high = mid;
		}
		else //长度<M
		{
			left = mid + 1;
		}
	}

	cout << high;
	delete[] arr;
	return 0;
}


回复

1 条回复,欢迎继续交流。

正在加载回复...