CSP202012-2期末预测之最佳阈值(前缀和)

本文解析了一道算法竞赛题目,通过使用前缀和技巧避免了O(n^2)的时间复杂度,确保算法效率。介绍了如何统计特定条件下的元素数量,并通过实例详细说明了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题的前缀和比较烦了 不用的话显然O(n^2)必定超时

sum00【i】记录的是小于等于序号i的0的数量 但还要注意细节 考虑等于前一个score 的情况(幸好样例考虑的是比较全面的)

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct Node
{
	int score,res;
}node[maxn];

bool cmp(Node a,Node b)
{
	return a.score<b.score;
}
int main()
{
	int m;
	scanf("%d",&m);
	int sum00[maxn]={0},sum11[maxn]={0};
	int sum0=0,sum1=0;
	for(int i=0;i<m;i++)
	{
		scanf("%d%d",&node[i].score,&node[i].res);
	}
	
	sort(node,node+m,cmp);

	for(int i=0;i<m;i++)
	{
		if(node[i].res==0)
		{
			sum0++;
			sum00[i]=sum0;
			
			
			
		}
		else
		{
			sum00[i]=sum0;
			if(i!=0)
			if(node[i].score==node[i-1].score) sum00[i]--;
		}
	//	printf("sum00:%d\n",sum00[i]);
	}
	
	for(int i=m-1;i>=0;i--)
	{
		if(node[i].res==1)
		{
			sum1++;
			sum11[i]=sum1; //大于等于node[i].score的1数量 
			
		}
		else
		{
			sum11[i]=sum1;
			if(i!=m-1)
			if(node[i].score==node[i+1].score) sum11[i]--;
		}
	//	printf("sum11:%d\n",sum11[i]);
		
	}

			//test
//	printf("sum0 sum1:%d %d\n",sum0,sum1); 
	
	int right=0,max=-1,maxi=-1;
	for(int i=0;i<m;i++)
	{
		right=sum00[i]+sum11[i];
		if(right>=max)
		{
			max=right;
			maxi=i;
		}
		
	}
	
	printf("%d",node[maxi].score);
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值