[编程题] 罪犯转移
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
输入描述:
第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
输出描述:
一行输出答案。
输入例子:
3 100 2 1 2 3
输出例子:
2
#include <vector>
#include <deque>
#include <iostream>
using namespace::std ;
int main() {
int n, t, c ;
while ( cin >> n >> t >> c ) {
vector<int> vec ;
for ( int i = 0; i < n; ++ i ) {
int tmp ;
cin >> tmp ;
vec.push_back( tmp ) ;
}
int sum = 0 ;
int count = 0 ;
for ( int i = 0; i < c; ++ i ) {
sum += vec[i] ;
}
if ( sum <= t ) ++ count ;
for ( int i = c; i < n; ++ i ) {
sum -= vec[i - c] ;
sum += vec[i] ;
if ( sum <= t ) {
++ count ;
}
}
cout << count << endl ;
}
return 0 ;
}
第二次做:
#include <iostream>
#include <vector>
using namespace::std ;
int main() {
int n, t, c ;
while ( cin >> n >> t >> c ) {
vector<int> vec ;
for ( int i = 0; i < n; ++ i ) {
int tmp ;
cin >> tmp ;
vec.push_back( tmp ) ;
}
int sum = 0 ;
int count = 0 ;
for ( int i = 0; i < c; ++ i ) {
sum += vec[i] ;
}
if ( sum <= t ) ++ count ;
for ( int i = c; i < n; ++ i ) {
sum -= vec[i - c] ;
sum += vec[i] ;
if ( sum <= t ) ++ count ;
}
cout << count << endl ;
}
return 0 ;
}
第三次做:
#include <iostream>
#include <vector>
using namespace::std ;
int main() {
int n, t, c ;
while ( cin >> n >> t >> c ) {
if ( n <= 0 || t <= 0 || c <= 0 ) continue ;
vector<int> vec( n, 0 ) ;
for ( int i = 0; i < n; ++ i ) {
cin >> vec[i] ;
}
int result = 0 ;
if ( n < c ) {
result = 0 ;
} else {
for ( int i = 0; i < n - c + 1; ++ i ) {
int val = 0 ;
for ( int j = i; j < i + c; ++ j ) {
val += vec[j] ;
}
if ( val <= t ) ++ result ;
}
}
cout << result << endl ;
}
return 0 ;
}