社区讨论
球球帮看代码,这个输出结果一直是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 条回复,欢迎继续交流。
正在加载回复...