Codeforces Round #350 (Div. 2) (二分答案)

来源:互联网 发布:html php 编辑:程序博客网 时间:2024/05/16 04:55

【题意】给了n个物品和k,a[i]表示做成第i个物品需要的材料,b[i]表示当前第i种物品的材料重量。k代表可以在任意一种物品,或者多个添加该种物品的不定重量,最后求可以合成的最多的物品数。

【分析】裸二分答案,就是数据范围有点坑,还要注意二分的姿势,二分最近总是写错,以前还没有错过。

【AC代码】

//623 ms#include <bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 100010;int n;ll k;ll a[maxn],b[maxn];ll solve(ll x){    ll cur=k;    for(int i=0; i<n; i++){        ll temp = b[i]-a[i]*x;        if(temp<0) cur+=temp;        if(cur<0) return -1;    }    return 1;}int main(){    cin>>n>>k;    for(int i=0; i<n; i++) cin>>a[i];    for(int i=0; i<n; i++) cin>>b[i];    ll l=0,r=3e9;    while(l<=r){        ll mid = (l+r)>>1;        if(solve(mid)<0) r=mid-1;        else l=mid+1;    }    cout<<l-1<<endl;    return 0;}

【ps贴一个队长的神版本】

//46 ms#include<cstdio>#include<cstring>int a[100005],b[100005];int k,n;bool judge(int x){    int kk=k;    for(int i=1;i<=n;i++)    {        int y=b[i]+kk;        if(x>y/a[i]) return 0;        y=a[i]*x;        if(y>b[i]) kk-=y-b[i];    }    return 1;}int main(){    scanf("%d %d",&n,&k);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    for(int i=1;i<=n;i++) scanf("%d",&b[i]);    int l=0,r=2e9;    while(l<r)    {        int mid=l+(r-l+1)/2;       // printf("%d\n",mid);        if(judge(mid)) l=mid;        else r=mid-1;    }    printf("%d\n",l);    return 0;}


1 0
原创粉丝点击