4 条题解
-
0
def get_wood_amount(trees, cut_height): # 计算砍下的木材总长度 wood = sum(tree - cut_height for tree in trees if tree > cut_height) return wood def find_max_height(trees, m): low, high = 0, max(trees) result = 0 while low <= high: mid = (low + high) // 2 wood = get_wood_amount(trees, mid) if wood >= m: result = mid low = mid + 1 else: high = mid - 1 return result # 读取输入 n, m = map(int, input().split()) trees = list(map(int, input().split())) # 计算结果 max_cut_height = find_max_height(trees, m) # 输出结果 print(max_cut_height)
-
0
#include<bits/stdc++.h> using namespace std; using ll=long long; int n; const int N=1e6+5; ll m,a[N]; bool check(ll mid){ ll sum=0; for(int i=1;i<=n;i++){ if(a[i]-mid<=0){//如果该树高<=砍树高度,直接跳过 continue; } sum+=(a[i]-mid); } if(sum>=m){//当sum>=m说明砍树的高度要<=该mid return true; } return false; } int main(){ cin>>n>>m; ll maxx=0; for(int i=1;i<=n;i++){ cin>>a[i]; maxx=max(maxx,a[i]); } sort(a+1,a+1+n);//先排序 ll l=1,r=maxx,ans=0; while (r - l > 1) // 当右边界与左边界相差大于1时 { int mid = (l + r) >> 1; // 取中间位置 if (check(mid)){ // 如果满足条件 ans=mid;//最后得到的mid就是答案 l = mid; // 更新左边界为mid } else{ r = mid; // 否则更新右边界为mid } } cout<<ans<<endl; return 0; }
-
0
普普通通二分题
我叫你开longlong你二龙嘛#define _CRT_SECURE_NO_WARNINGS 1 /** * @brief 打开宏开关 * */ #define _USE_MATH_DEFINES #include <cmath> #include <bits/stdc++.h> using namespace std; #define ll long long const int N = 1e6 + 5; ll n, m; ll a[N]; bool bisearch(ll h) { ll sum = 0; for (int i = 1; i <= n; i++) { if (a[i] > h) sum += a[i] - h; } return sum >= m; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; ll l = 1, r = 1e9; while (l + 1 < r) { ll m = l + r >> 1; if (bisearch(m)) l = m; else r = m; } if (bisearch(l)) cout << l; else cout << r; return 0; }
-
0
二分答案即可
#include <bits/stdc++.h> using namespace std; const int N = 1000010; int a[N]; int n,m; int mx = -1; bool check(int x){ long long sum = 0; for (int i = 1; i <= n; ++i) { if (a[i] > x) { sum += (a[i] - x); }else{ continue; } } if (sum < m) return true; return false; } int main(){ scanf("%d %d",&n,&m); for (int i = 1; i <= n; ++i) { scanf("%d",&a[i]); mx = max(mx,a[i]); } int l = 1,r = mx; while (l + 1 < r) { int mid = (l + r)/2; if (check(mid)) { r = mid; }else { l = mid; } } printf("%d\n",l); return 0; }
- 1
信息
- ID
- 89
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 914
- 已通过
- 203
- 上传者