Codeforce Problem 427B. Prison Transfer

题目链接: http://codeforces.com/problemset/problem/427/B

题目意思:

       某城市治安太差,抓的罪犯太多,监狱管不下了,需要将罪犯运到其他城市去,初始条件如下:

              1、罪犯排成一行,并编号;

              2、罪越重,编号越大;

              3、初始提供三个值:n(罪犯的数量), t(运送的人的罪不超过这个值), c(运送的罪犯数量)

       选择罪犯的两个条件:

              1、 罪犯在物理上连续的, c 个;

              2、罪超过 t

题目思路:

        差不多也是纯模拟题,只是细节上稍微处理下,不然要超时,两点需要注意:

             1、 从 i 开始选择 c 个连续罪犯的时候,如果遇到第 i + j 个数的值比 t 大, 那么从第 i + j + 1 个数开始找下一个连续的 c 个数,因为前面的 c 个连续的数总会包含第 i + j 那个数;

            2、 如果找到 c 个连续的数都比 t 小,那么只需要判断下个数与 t 的关系, 如果值比 t 小,则说明又找到一个,否则从这个值得下一个位置开始找一个连续的值。

附上代码:

  

/* ***
* @Codeforce Problem 427B. Prison Transfer
* @2014.5.11
*****/

#include <stdio.h>
#define MAXN (2*100005)

int p[MAXN];
int main(){
    int i, j, n, t, c, ans;
    scanf("%d%d%d", &n, &t, &c);
    for(i = 0; i < n; ++i){
        scanf("%d", p+i);
    }
    ans = 0;
    for(i = 0; i < n-c+1; ++i){
        int f = 0;
        for(j = 0; j < c; ++j){
            if(p[i+j] > t){
                f = 1;
                break;
            }
        }
        if(f){
            i = i+j;    
        }
        else{
            ans++;
            while(i + j < n && !(p[i+j] > t)){
                ++i;
                ans++;
            }
            i = i + j;
        }
    }
    printf("%d\n", ans);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值