首页 > 其他分享 >P5745【深基附B例】区间最大和

P5745【深基附B例】区间最大和

时间:2024-09-10 17:54:25浏览次数:3  
标签:P5745 int aj long ai ansm 区间 8000005 深基附

思路一:枚举区间头尾i,j,然后对i和j里面所有数字累加起来求和,再判断是否在不大于M的情况下最大。

#include<iostream>
using namespace std;
int a[8000005];
int main() {
	int n, M, ansm = 0, ai, aj;
	cin >> n >> M;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		for (int j = i; j <= n; j++) {
			int sum = 0;
			for (int k = i; k <= j; k++) {
				sum += a[k];
			}
			if (sum <= M && sum > ansm) {
				ansm = sum;
				ai = i;
				aj = j;
			}
		}
	}
	cout << ai << " " << aj << " " << ansm;
	return 0;
}

结果只有惨不忍睹的10分。

思路二:使用前缀和快速求出区间和。

#include<iostream>
using namespace std;
int a[8000005], s[8000005];
int main() {
	int n, M;
	int ansm = 0, ai, aj;
	cin >> n >> M;
	s[0] = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		s[i] = s[i - 1] + a[i];
	}
	for (int i = 1; i <= n; i++) {
		for (int j = i; j <= n; j++) {
			int sum = s[j] - s[i - 1];
			if (sum <= M && sum > ansm) {
				ansm = sum;
				ai = i;
				aj = j;
			}
		}
	}
	cout << ai << " " << aj << " " << ansm;
	return 0;
}

挽救了20分,变成30分。

思路三:还要快(比赛的时候能骗到这些分就够了)该怎么办呢?尝试用二分。

#include<iostream>
using namespace std;
int a[8000005];
long long n,M,s[8000005];
int find(long long x){
	int l=1,r=n+1;
	while(l<r){
		int mid=(l+(r-1))/2;
		if(s[mid]>=x){
			r=mid;
		}else{
			l=mid+1;
		}
	}
	if(s[l]==x){
		return l;
	}else{
		return l-1;
	}
}
int main(){
	long long ansm=0;
	int ai,aj;
	cin>>n>>M;
	s[0]=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	for(int i=1;i<=n;i++){
		long long x=s[i-1]+M;
		int j=find(x);
		long long sum=s[j]-s[i-1];
		if(sum<=M&&sum>ansm){
			ansm=sum;
			ai=i;
			aj=j;
		}
	}
	cout<<ai<<" "<<aj<<" "<<ansm;
	return 0;
}

终于AC啦。

标签:P5745,int,aj,long,ai,ansm,区间,8000005,深基附
From: https://blog.csdn.net/xhbqy/article/details/142104696

相关文章

  • 2080. 区间内查询数字的频率
    题目链接2080.区间内查询数字的频率思路二分法(upper_bound-lower_bound)题解链接简洁写法:统计位置+二分查找(Python/Java/C++/Go/JS/Rust)关键点预先处理得到每个值所处位置的列表时间复杂度\(O(n+m\logn)\)空间复杂度\(O(n)\)代码实现:classR......
  • CNN-BiLSTMNTS-KDE多变量时序区间预测
     CNN-BiLSTMNTS-KDE多变量时序区间预测CNN-BiLSTMNTS-KDE多变量时序区间预测代码获取戳此处代码获取戳此处代码获取戳此处一、原理CNN-BiLSTMNTS-KDE模型结合了卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)、非参数时序建模(NTS)以及核密度估计(KDE)来进行多变量时序数据的......
  • NOIP集训Day24 DP常见模型3 - 区间
    NOIP集训Day24DP常见模型3-区间A.[CF1572C]Paint设\(f_{i,j}\)表示区间\([i,j]\)涂成一种颜色的最小染色次数。可以发现对于区间\([i,j]\),一定有一个最优方案使得整个区间最后染色成\(a_j\)。这是因为\(j\)在区间\([i,j]\)的边缘,一定存在一个\(k\in[i,j-......
  • NOIP2024集训Day22 DP常见模型3 - 区间
    NOIP2024集训Day22DP常见模型3-区间A.[SCOI2003]字符串折叠因为前面折叠了会对后面产生影响,所以很显然不能贪心。考虑区间DP。定义\(f_{i,j}\)表示\(i\)到\(j\)范围内可以折叠到的最短长度。答案为\(f_{1,n}\)。状态转移:对于\(f_{i,j}\),使用区间DP惯用套路,枚......
  • 763. 划分字母区间
    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。示例1:输入:s="ababcbacadefegdehijhklij"输出:[9,7,8]......
  • 拟合的置信区间
    目标图:图片来源:Fig.4efromArwani,RuthTheresia,etal."Stretchableionic–electronicbilayerhydrogelelectronicsenableinsitudetectionofsolid-stateepidermalbiomarkers." NatureMaterials (2024):1-8.1.数据输入假设原始数据如下:在MATLAB中,新建2个变量,......
  • 8602 区间相交问题(优先做)
    ###思路1.**输入处理**:读取区间数和每个区间的端点。2.**排序区间**:按照区间的右端点进行排序。3.**选择区间**:使用贪心算法选择不相交的区间,尽可能多地选择区间。4.**计算结果**:计算需要去掉的区间数。###细节-**排序**:将所有区间按照右端点从小到大排序。-**......
  • 【高中数学/极值/判别式法】已知实数a和b,b在(0,1)区间,a-b=1,则1/(a-1)+1/(5-4b)的最小
    【问题】已知实数a,b,b在(0,1)区间,a-b=1,则1/(a-1)+1/(5-4b)的最小值是?【来源】《解题卡壳怎么办高中数学解题智慧点剖析》P34余继光苏德矿合著浙江大学出版社出版【破题点】将a-1用b取代,发现结果是二次式相除,正好可用判别式法。【解答】由a-b=1得到a-1=b于是原式=1/b+1/(5-4b)......
  • 分享丨【题单】贪心算法(基本贪心策略/反悔/区间/字典序/数学/思维/构造)
    作者:灵茶山艾府链接:https://leetcode.cn/circle/discuss/g6KTKL/一、贪心策略有两种基本贪心策略:从最小/最大开始贪心,优先考虑最小/最大的数,从小到大/从大到小贪心。在此基础上,衍生出了反悔贪心。从最左/最右开始贪心,思考第一个数/最后一个数的贪心策略,把n个数的原问题转......
  • 56. 合并区间(leetcode)
    https://leetcode.cn/problems/merge-intervals/description/经典题合并区间classSolution{publicint[][]merge(int[][]intervals){Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));//区间合并经典题//思路是先加入第一个......