题目链接: 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;
}