Codeforces Round #355 (Div. 2)-B. Vanya and Food Processor,纯考思路~~

B. Vanya and Food Processor
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

                                                                                                                                   ->  Link  <-

   cf上的题果然很靠思路,这让我想起了学长说的那句话:每A完CF上的一套题都有不同的收获。

   这道题题意倒是不难理解:有一台机器,每次只能处理K cm的土豆,这台机器最多能放下hcm的土豆,如果剩下的土豆长度不足K,则1 s将其处理完;问给定顺序的n个土豆最少要用多少时间才能处理完;

   看样例就可以懂这道题的题意了,那么怎么做呢?我们发现无论土豆怎么放,每秒最多也只能处理K cm长的土豆,而条件限制是机器里能容纳的最大长度是h,然后就可以用一个贪心策略来解决;我们知道土豆的顺序是固定的,所以我们可以先放第一个,如果长度不足h则再判断下一个是否能放下,如果还能则继续判断下下个是否能够放下,如果当放完前一个,而放后一个总长度就会大于h时,显然不合题意,所以我们得先处理完机器里面的,每处理1 s机器里的总长度就减k,所以处理完需要sum/k的时间,这时机器里面的就可能有剩余了,然后再判断刚刚那个没有放进去的土豆能否放得下,如果可以则继续放,如果这个土豆都不能放下,则刚刚机器里剩余的即使小于k还是需要1 s来处理完,这时机器里的总长度就为0了,然后就相当于回到了初始状态;

    这道题我觉得很考思维的地方就在于我们现实中往机器里放东西是要时间的,而这里当机器处理完放东西进去是不用时间的,只需要判断处理的时间与放东西的状态是否符合题意,往往就是受现实生活的影响而影响了自己的思维;

#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
long long a[N];//注意题目数据范围;
int main()
{
    int n,k,h,i;
    while(~scanf("%d%d%d",&n,&h,&k))
    {
        long long x=0;
        long long sum=0;
        for(i=1; i<=n; i++)
        {
            scanf("%I64d",&a[i]);
            if(a[i]>h) continue;//实际上题目已经说明了,所以可以省略;
            if(sum+a[i]>h)//如果当前的土豆不能放进去,所以我们要先处理完机器里面的;
            {
                x+=sum/k;
                 sum%=k;
                if(sum+a[i]>h)//如果还有剩余,而当前要放进去的土豆又不能放进去则必须先处理完机器里面的;
                {
                    sum=0;
                    x++;
                }
            }
            sum+=a[i];//将当前待放得土豆放进去;
        }
        x+=sum/k;
        if(sum%k)
            x++;
        printf("%I64d\n",x);
    }
    return 0;
}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值