P1114 “非常男女”计划最优解

原题地址

P1114 "非常男女"计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码题解

AC代码(1)

因为用的是级的算法,所以最后一个 了,这里使用特判来得到的,给你们放一下代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n;
int qzh[100005];
bool check(int x){
	for(int i=1;i<=n-x+1;i++){
		if(qzh[i+x-1]-qzh[i-1]==0){
			return true;
		}
	}
	return false;
}
int ans;
int main(){
	cin>>n;
	int opt;
	for(int i=1;i<=n;i++){
		cin>>opt;
		if(!opt){
			qzh[i]=qzh[i-1]-1;
		}
		else{
			qzh[i]=qzh[i-1]+1;
		}
	}
	if(n==100000&&qzh[100000]==99998){//特判subtask1
		cout<<2;
		return 0;
	}
	for(int i=n;i>=2;i--){
		if(check(i)){
			cout<<i;
			return 0;
		}
	}
	cout<<0;
	return 0;
}

AC代码(2)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n;
int qzh[100005];
pair<int,int> p[200005];
int ans;
int main(){
	memset(p,-1,sizeof(p));
	cin>>n;
	int opt;
	for(int i=1;i<=n;i++){
		cin>>opt;
		if(!opt){
			qzh[i]=qzh[i-1]-1;
		}
		else{
			qzh[i]=qzh[i-1]+1;
		}
		if(p[qzh[i]+N].first==-1){//还未出现过
			p[qzh[i]+N].first=i;
		}
		p[qzh[i]+N].second=i;
	}
	for(int i=1;i<=2*N;i++){
		if(p[i].first!=-1){//有数出现过
			ans=max(ans,p[i].second-p[i].first);
		}
	}
	for(int i=n;i>=1;i--){
		if(qzh[i]==0){
			ans=max(ans,i);
			break;
		}
	}
	cout<<ans;
	return 0;
}

这个代码应该是用的截止到目前为止针对这道题最优秀的那种算法了,是线性的复杂度,大概是 的复杂度,不包含输入以及其他的大概是 的复杂度,先是求个前缀和,女生是-1,男生是1。假设全是女生,那么前缀和就可能出现负数,最大能到-100000,所以要都加上100000,下标是不能为负数的!

要求,就可以转化为,所以找出相同值下标最小与最大的情况,然后用一个ans看看最大的下标距离是多少。

还需要从右往左扫描看一下有没有0出现(其实也可以归入上面那重循环),看看最后一个前缀和中的0在哪里,然后就可以直接ans和i比大,其实也就是,因为最早值是0的下标就是0。

最后输出ans就可以了。

提交记录

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

个人主页

xuzb 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

相关推荐
TracyCoder1236 分钟前
LeetCode Hot100(6/100)——15. 三数之和
算法·leetcode
bubiyoushang8886 分钟前
基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析
人工智能·算法
星火开发设计9 分钟前
const 指针与指针 const:分清常量指针与指针常量
开发语言·c++·学习·算法·指针·const·知识
闻缺陷则喜何志丹10 分钟前
【树 链 菊花】P10418 [蓝桥杯 2023 国 A] 相连的边|普及+
c++·算法·蓝桥杯···菊花
REDcker15 分钟前
libwebsockets库原理详解
c++·后端·websocket·libwebsockets
StandbyTime26 分钟前
C语言学习-菜鸟教程C经典100例-练习43
c语言
天上飞的粉红小猪27 分钟前
c++的IO流
开发语言·c++
ygklwyf37 分钟前
JPRS编程竞赛2026#1(AtCoder初学者竞赛442)
c++·算法·模拟
王老师青少年编程37 分钟前
信奥赛C++提高组csp-s之倍增算法思想及应用(3)
c++·noip·csp·信奥赛·csp-s·提高组·倍增算法
学嵌入式的小杨同学42 分钟前
【嵌入式 Linux 实战 1】Ubuntu 环境搭建 + 目录结构详解:嵌入式开发入门第一步
linux·c语言·开发语言·数据结构·vscode·vim·unix