202109-2 非零段划分--C++
2023-12-13 04:19:48
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int A[500001];
int FindSum(int A[],int p,int n)
{
for(int i=1;i<=n;i++)//所有小于p的都变0
{
if(A[i]<p) A[i]=0;
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(A[i]!=0&&A[i+1]==0) sum++;
}
return sum;
}
int main()
{
int n;//n个数
int Mostp=0;
cin>>n;
int sum=0;//记录不做任何操作时的总的非0段数
cin>>A[1];
for(int i=2;i<=n;i++)
{
cin>>A[i];
if(A[i]>Mostp) Mostp=A[i];
if(A[i-1]==0&&A[i]!=0) sum++;
}
if(A[n]!=0) sum++;
for(int p=2;p<=Mostp;p++)
{
if(FindSum(A,p,n)>sum) sum=FindSum(A,p,n);
}
cout<<sum;
return 0;
}
暴力算法:70分
差分法+前缀和:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 500000;
const int M = 10000;
int a[N+2], d[M+1];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
a[0] = a[n+1] = 0;
// unique 去除相邻重复的元素,并把他们移动到末尾
// n 为相邻不重复时的数组长度,从0到n,不包括n
n = unique(a, a+n+2)-a;//unique,去除相邻的重复元素,返回的是去除之后的元素个数
memset(d, 0, sizeof d);//对较大的结构体或数组进行清零操作的一种最快方法
for (int i = 1; i < n-1; i++){//当p=i时有几个凸点
if (a[i-1] < a[i] && a[i] > a[i+1]){
d[a[i]]++;
}else if (a[i-1]>a[i] && a[i]<a[i+1]){
d[a[i]]--;
}
}
int ans = 0, sum = 0; //差分后缀和即为答案
for (int i = M; i >= 1; i--){
sum += d[i], ans = max(ans, sum);
}
cout << ans << endl;
return 0;
}
文章来源:https://blog.csdn.net/weixin_69266073/article/details/134854886
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!