Examnation 20170606 T2 prob

题目描述 Description
OI教练BG在n天中每天早晨会给wxjlzbcd发一套题,其中包含A_i道题目。如果不做的话,题目会累加到下一天。
wxjlzbcd每天能够刷掉的题目数量为B_i,BG的题目数量太少,可能不能满足wxjlzbcd每天刷题的需求,如果题目数量不够,wxjlzbcd当天就不会刷题,因为空出来的时间他有可能会浪费掉。

但是wxjlzbcd不想天天颓废,他想知道自己最多能有多少天有题刷。
输入输出格式 Input/output
输入格式:
输入第1行为一个整数n,表示天数。
第2行包括n个数字A_i,表示BG n天中每天发的题目数A_i。
第3行包括n个数字B_i,表示wxjlzbcd n天中每天能刷掉的题目数B_i。
输出格式:
输出第1行为一个整数ans,表示天数。
输入输出样例 Sample input/output
样例测试点#1
输入样例:
5
1 4 1 2 3
1 2 3 4 5
输出样例:
4
说明 description
对于40%的数据,保证1≤n≤1000;
对于100%的数据,保证1≤n≤250000,0≤a_i≤10^9,0≤b_i≤10^9。

贪心算法

这个题要用到贪心算法,一般做法就是从前往后找,如果当天总共题目数能满足当天要求就继续向后,如果不行就找前面用过的消耗题目数最多的一天,如果之前选出的这一天不做题后能够满足现在这一天的要求的话,就将这一天取消。
如果不用根堆的话只能得60分。代码(60):

#include<iostream>
#include<algorithm>
#include<deque>
#include<cstring>
using namespace std;
int i,j,h,n,m,maxx,ma;

int temp,a[250001],t;
int b[250001],c[250001];
int r()
{
    int ans=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        ans*=10;
        ans+=ch-'0';
        ch=getchar();
    }
    return ans;
}

int main()
{
    freopen("prob.in","r",stdin);
    freopen("prob.out","w",stdout);
    n=r();
    for(i=1;i<=n;i++)
    a[i]=r();

    for(i=1;i<=n;i++)
    {
        c[i]=r(),maxx=0;
        temp+=a[i];
        if(temp>=c[i])
        t++,temp-=c[i],b[i]=1;
        else
        {for(j=1;j<i;j++)
        if(c[j]>c[i]&&maxx<c[j]&&b[j])
        maxx=c[j],ma=j;
        if(maxx)
        temp+=c[ma],temp-=c[i],b[ma]=0,b[i]=1;}

    }
    cout<<t;
    return 0;
}

用了C++STL之后就是这样:代码(100)

#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int i,j,n,m;

int a[250001];
long long temp;
int b[250001],c[250001];
int r()
{
    int ans=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        ans*=10;
        ans+=ch-'0';
        ch=getchar();
    }
    return ans;
}
priority_queue<pair<int,int> >q;
int main()
{
    freopen("prob.in","r",stdin);
    freopen("prob.out","w",stdout);
    n=r();
    for(i=1;i<=n;i++)
    a[i]=r();
    for(i=1;i<=n;i++)
    c[i]=r();

    for(i=1;i<=n;i++)
    {
        temp+=a[i];
        if(temp>=c[i])
        {
            q.push(make_pair(c[i],i));
            temp-=c[i];
            b[i]=1;
        }
        else
        if(!q.empty()&&c[i]<q.top().first)
        {
            b[q.top().second]=0;
            temp+=q.top().first;
            q.pop();
            temp-=c[i];
            q.push(make_pair(c[i],i));
            b[i]=1;
        }
    }
    cout<<q.size();
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值