求条

P2440 木材加工

rainbow_MMM @ 2024-12-22 15:20:49

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000005],n,m,l,r=100000000000;
bool chk(int x) {
    int ans=0;
    for(int i=1;i<=n;i++) {
        if(a[i]>=x) {
            ans+=a[i]/x;
        }
    }
    return ans>=m;
}
signed main() {
    int ans=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    while(l<=r) {
        int mid=(l+r)>>1;
        if(chk(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<ans;
    return 0;
}

by KellyH @ 2024-12-22 15:44:12


by KellyH @ 2024-12-22 15:45:07

我也不知道,先把我7月的代码放这

#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long a[1000005];
bool z(long long x) 
{
    long long ans=0;
    for(int i=1;i<=n;i++) 
    {
        ans+=a[i]/x;
    }
    return ans>=k;
}
int main() 
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
    }
    long long l=0,r=100000005,mid;
    while(l+1<r) 
    {
        mid=(l+r)/2;
        if(z(mid)) 
        {
            l=mid;
        }
        else 
        {
            r=mid;
        }
    }
    cout<<l;
    return 0;
} 

by KellyH @ 2024-12-22 15:54:36

@rainbow_MMM qp


by xuzifan123 @ 2024-12-22 16:38:14

分析题目 看起来有点复杂,其实很简单。

时间复杂度为O(log2n)

只要把木材每段长度二分就行了。

首先,还是两个指针l和r。

由于我们不知道长度的范围,这里就用一个大数据来代替。

long long s,l=0,r=0x7fffffff;

输入

cin>>n>>k;

for(int i=1;i<=n;i++)cin>>a[i];

开始二分。

我们还是区中点,找范围。

但这里判断方式不一样,我们为了要确保段数要符合条件,我们还需要一个判断。

判断方式就是累加段数,看看有没有小于段数,如果小就将左指针向右移至当前中点。

如果大于等于段数,就将右指针向左移至当前中点

int js(int x){

    register int i;
    t=0;
    for(i=1;i<=n;i++){
        t+=a[i]/x;
        if(t>=k) return 1;
    }
    return 0;
} 

while(l+1<r)
    {

        m=l+(r-l)/2;
        if(js(m)==1) l=m;
        else r=m;
    }

最后输出

cout<<l;

贴代码:

#include<bits/stdc++.h>
using namespace std;
long long a[100001],t=0,k,m,n;
int js(int x){
    register int i;
    t=0;
    for(i=1;i<=n;i++){
        t+=a[i]/x;
        if(t>=k) return 1;
    }
    return 0;
}
int main(){
    long long s,l=0,r=0x7fffffff;
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    while(l+1<r){
        m=l+(r-l)/2;
        if(js(m)==1) l=m;
        else r=m;
    }
    cout<<l;
    return 0;
}

|