Alice最近在抽奖活动中抽中了一等奖。她可以免费获得一些礼品作为奖励。 当前有n个不同的礼品排成一排,其中第i个礼品的重量为w[i],价值为v[i]。显然每个礼品只能被Alice拿走一个。为了避免在选择礼品上耽误太多时间,Alice只想选择一段连续区间中的礼品带走。 根据活动规则要求,Alice选择带走礼品的总重量不能超过m。请编写一个程序,帮助Alice选择一段连续的礼品,使得这段礼品总重量不超过m,且价值之和最大。 输入格式 从文件 gift.in 中读入数据。 输入第一行包含两个整数n和m,表示礼品的个数和可以带走礼品的总重量上限。 之后n行,每行两个整数w[i]和v[i],分别表示第个礼品的重量和价值。 输出格式 输出到文件 gift.out 中。 输出只有一行,该行仅包含一个整数,表示Alice挑选的礼品总价值最大是多少。 样例:
9 1615 914 790 574 220 725 560 303 179 611 257 449 508 698 310 858 335 980 32
对应输出:
1010
#include <bits/stdc++.h>
using namespace std;
const int pts100 = 3e5 + 10;
int n, m;
int W[pts100], V[pts100];
int doit(){
for(int i = 1; i <= n; i++){
cin >> W[i] >> V[i];
}
int l = 1, r = 1, tw = W[1], tv = V[1], ans = -1;
while(l <= n){
if(tw > m){
// tw -= W[l];
// tv -= V[l];
l++;
}
else if(r < n) {
r++;
tw += W[r];
tv += V[r];
}
ans = max(ans, tv);
}
return ans;
}
int main(){
// freopen("gift.in", "r", stdin);
// freopen("gift.out", "w", stdout);
cin >> n >> m;
cout << doit() << endl;
return 0;
}