求助dalao,P3594有几个点RE了啊啊啊啊
  • 板块学术版
  • 楼主画船听雨
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/1/24 17:05
  • 上次更新2023/10/28 11:18:02
查看原帖
求助dalao,P3594有几个点RE了啊啊啊啊
268811
画船听雨楼主2022/1/24 17:05
#include<iostream>
#include<set>
#include<queue>
using namespace std;

int a[100007];
long long a1[100007];
int main() {
	int n, d, i, temp, j, max1, len, flag, k, temp2;
	long long p, sum, sum2 = 0;
	multiset<int> b, l;
	multiset<int>::iterator it;
	queue<int> q;
	cin >> n >> p >> d;
	for (i = 0; i < n; i++) {
		cin >> a[i];
		/*把这个数对应区间的值加起来。比如题目给的样例,处理后a1[0]=3,a1[1]=4+3,a1[2]=1+4+3,a1[3]=9+1+4-3*/
		if (q.size() < d) {
			q.push(a[i]);
			sum2 = sum2 + q.back();
			a1[i] = sum2;
		}
		else {
			q.push(a[i]);
			sum2 = sum2 - q.front() + a[i];
			q.pop();
			a1[i] = sum2;
		}
	}
	for (i = 0; i < n; i++) {
		len = 0;
		flag = 0;
		sum = 0;
		for (j = i; j < n; j++) {
			sum = sum + a[j];
			temp = j + 1;
			temp2 = j;
			if (sum > p) {/*这个区间累计的值第一次大于p后,开始置0操作*/
				flag++;
				if (flag == 2)/*第二次又大于p就要记录区间长度并且跳出*/
					break;
				if (j - d < i)/*j和i的间隔小于d,要满足题意只能把j后移相应长度*/
					j = i + d - 1;
				max1 = a1[j];
				for (k = j; k < temp2 + d; k++) {
					if (k == n)
						break;
					if (a1[k] >= max1) {
						max1 = a1[k];
					}
				}
				for (temp; temp < k; temp++)/*把跳过了的那些数加起来*/
					sum = sum + a[temp];
				sum = sum - max1;
				j = k - 1;
			}
		}
		len = j - i;
		l.insert(len);/*把长度len放在set类型的l里面,自动排好序了*/
	}
	it = l.end();
	it--;/*输出最后一个(即最大)元素*/
	cout << *it;
	return 0;
}
2022/1/24 17:05
加载中...