Ural 1061. Buffer Manager

1061. Buffer Manager

Time limit: 2.0 second
Memory limit: 64 MB
Data blocks being read by DBMS from the hard drive are stored in the main memory in a fixed number of pre-allocated  buffers. Each buffer can hold one data block. Each buffer can be either  free(does not contain any useful information) or  occupied by some data. When DBMS is going to read data block from the hard drive it has to decide which buffer to use for data storing. If there are any free buffers, then one of them is used for that purpose. If there are no free buffers, then one of the occupied buffers has to be flushed to become free, unless it was  locked by some part of DBMS.
The choice of the buffer to flush is critical to DBMS performance. A lot of different algorithms were developed, LRU (Least Recently Used) algorithm being the one used most often. However, your DBMS is going to implement the Advanced Buffer Management algorithm which takes advantage of the fact that maximal performance is achieved when a number of consecutive data blocks from the hard drive are read into consecutive memory buffers.
Buffers are numbered from 1 to  N, where  N (1 ≤  N ≤ 100000) is a total number of buffers. Each buffer can be in any one of the following states: free, occupied or locked. Each occupied buffer is assigned an integer number from 1 to 9 – the  worthiness of the currently stored information in that buffer. The worthiness of free buffers is considered to be zero. Locked buffers cannot be neither used nor flushed and their worthiness is undefined.
Having received the request to read  K (1 ≤  K ≤ 10000) data blocks from the hard drive, Buffer Manager has to choose  K consecutive non-locked buffers numbered from  L to  L+ K-1 that have minimal possible sum of their worthiness, or to report that it is impossible to find  K consecutive non-locked buffers. The latter can also happen if total number of buffers is less than  K.
Your task is to write a program that models the processing of one request to Buffer Manager using the above algorithm.

Input

The first line of the input contains two integers,  N and  K, separated by a space.
Starting from the second line there is a description of a buffers' state. The state of each buffer is represented by a single character:
  • 0 – when the corresponding buffer is free.
  • 1 – when the corresponding buffer is occupied and has worthiness of 1.
  • 2 – when the corresponding buffer is occupied and has worthiness of 2.
  • ...
  • 9 – when the corresponding buffer is occupied and has worthiness of 9.
  • * – when the corresponding buffer is locked.
Those characters are situated on the consecutive lines grouped by 80 characters per line without any spaces. Thus, each line starting from the second one contains exactly 80 characters with a possible exception for the last line.

Output

Write to the output the single integer number  L. This number gives the buffer number where first of the  K blocks from the hard drive shall be read to ensure the minimal possible total worthiness of the blocks that have to be flushed. If there are more than one such value for  L, then write the smallest one.
Write to the output a single number 0 if it's impossible to find  K consecutive non-locked buffers.

Sample

input
100 53
2165745216091853477755800393859785807207523169954341**7363*9*94664808*4777717089
09825185827659480548
output
0
Problem Source: 2000-2001 ACM Northeastern European Regional Programming Contest
Tags: none   (
hide tags for unsolved problems
)
#include<iostream>
using namespace std;
const int MIN=99999;
int arr[100005];
int main()
{
    char c;
    int l,k;
    cin>>l>>k;
    int minn=MIN,ans=0;
    for(int i=1; i<=l; i++)
    {
        cin>>c;
        if(c=='*')
            arr[i]=arr[i-1]+MIN;
        else
            arr[i]=arr[i-1]+c-'0';
        if(i>=k&&arr[i]-arr[i-k]<minn)
        {
            minn=arr[i]-arr[i-k];
            ans=i-k+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值