Codeforces 670D

题目:胡大加工厂要组装一种产品。组装该产品需要n种零件,每组装一个该产品需要第i种零件ai个。胡大有第i种零件bi个。此外,胡大还有一种特殊的零件,每个特殊零件可以当作任意一个其它零件使用。那么问题来了,胡大最多一共可以组装多少个该产品?

Input
对于每个样例:

第一行包括两个正整数n 、k (1 ≤ n, k ≤ 1000),组成该产品需要的零件的种类数和胡大有的特殊零件的数量

第二行包含n个数a1, a2, …, an (1 ≤ ai ≤ 1000),第i个数代表组装一个该产品需要第i种零件的数量

第三行包含b个数b1, b2, …, bn (1 ≤ bi ≤ 1000),第i个数代表胡大拥有的第i种零件的数量

思路:第一个题目数据量比较小,直接暴力查找

#include 
using namespace std;
int n,k;
//int a[1000000009],b[1000000009],c[1000000009];
struct node
{
    int a,b;
    int c;
    int x;
}p[1000009];
int main()
{
    while(cin>>n>>k){
         for(int i=1;i<=n;i++)
        cin>>p[i].a;
    int m=1e18;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i].b;
        p[i].c=p[i].b/p[i].a;
        m=min(m,p[i].c);
      //  p[i].x=(p[i].c+1)*p[i].a-p[i].b%p[i].a;
    }
    while(1)
    {
        m++;
        int flag=0;
        for(int i=1;i<=n;i++){
            if(p[i].c<m){
                flag+=m*p[i].a-p[i].b;
            }
        }
        if(flag>k)
        {
            m--;
            break;
        }
    }
        cout<<m<<endl;
    }
}

对于每个样例:

第一行包括两个正整数n 、k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ 109),组成该产品需要的零件的种类数和胡大有的特殊零件的数量

第二行包含n个数a1, a2, …, an (1 ≤ ai ≤ 109),第i个数代表组装一个该产品需要第i种零件的数量

第三行包含b个数b1, b2, …, bn (1 ≤ bi ≤ 109),第i个数代表胡大拥有的第i种零件的数量

思路:数据量增大,就必须要用二分了。二分的是和k的差值。

#include 
#define int long long
using namespace std;
const int maxn=100005;
struct node
{
    int a,b;
}num[maxn];
signed main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>num[i].a;
    }
    int m=0;
    for(int i=1;i<=n;i++){
        cin>>num[i].b;
        m=max(m,(num[i].b+k)/num[i].a);
    }
    int l=0;int r=m;int maxx=0;
    while(l<=r){
        int mid=(l+r)/2;
        int p=k;int ans=0;
        for(int i=1;i<=n;i++){
            if(p<0)
            {
                ans=1;
                break;
            }
            if(num[i].b/num[i].a >=mid)
                continue;
            else
            {
                p-= mid*num[i].a-num[i].b;
            }
            if(p<0)
            {
                ans=1;
                break;
            }
        }
        if(ans)
        {
            r=mid-1;
        }
        else
        {
            maxx=max(maxx,mid);
            l=mid+1;
        }
    }
    cout<<maxx<<endl;
}

你可能感兴趣的:(CF,题目)