题目求调
  • 板块题目总版
  • 楼主LiGaYb
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/10/7 15:57
  • 上次更新2024/10/7 17:56:16
查看原帖
题目求调
935689
LiGaYb楼主2024/10/7 15:57

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;
}
2024/10/7 15:57
加载中...