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

这题的前缀和比较烦了 不用的话显然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);
	
}
上一篇:gc调优


下一篇:地铁出行线路规划