题目描述
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
解答:
暴力累加时间太长,只能用滑动窗口
1 #include <iostream> 2 #include <sstream> 3 #include <algorithm> 4 #include <numeric> 5 #include <stack> 6 #include <set> 7 #include <map> 8 #include <list> 9 #include <deque> 10 #include <string> 11 #include <vector> 12 #include <iterator> 13 #include <math.h> 14 using namespace std; 15 int CrimTrans2(vector<int> v, int t, int c) { 16 int answer = 0, sum = accumulate(v.begin(), v.begin() + c, 0); 17 if (sum <= t) answer++; 18 for (auto i = 0; i + c != v.size() ; i++) 19 { 20 sum = sum - v[i] + v[i + c]; 21 if (sum <= t) answer++; 22 23 } 24 return answer; 25 } 26 int main() { 27 int n,t,c; 28 while (cin >> n >> t>> c) 29 { 30 int num; 31 vector<int> v1; 32 for (auto i = 0; i < n; i++) 33 { 34 cin >> num; 35 v1.push_back(num); 36 } 37 cout << CrimTrans2(v1,t,c) << endl; 38 39 } 40 }