问题描述

思路
使用前缀和的思路
[1,i-1]区间0的个数(预测0正确次数): i-1-sum[i-1]
[i,m]区间1的个数(预测1正确次数): sum[m] - sum[i-1]
yi resulti sum[i] [1,i-1]区间0的个数 [i,m]区间1的个数
0 0 0 0 4
1 0 0 (重复的不考虑,会出错,用set.count去重)
1 1 1 1 4
3 1 2 2 3
5 1 3 2 2
7 1 4 2 1
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int sum[N]={0}; //前缀和
set<int>st; //实现去重
pair<int,int>pr[N]; //存储yi和resulti
int main()
{
int m;
cin >> m;
for(int i = 1; i <= m; i++)
cin >> pr[i].first >> pr[i].second;
sort(pr+1, pr+m+1);//1.先排序
for(int i = 1; i <= m; i++)
sum[i] =sum[i-1]+ pr[i].second;//2.求挂科情况前缀和
int yuce1, yuce0, yuce; //分别统计未挂科、挂科、总的预测正确次数
int Max = 0; //最大预测正确次数
int yi; //对应的安全指数yi
for( int i = 1; i <= m; i++)
{
int a = pr[i].first;
if( st.count(a))
continue;
st.insert(a);
yuce1 = sum[m] - sum[i-1]; //[i,m]区间内有多少个1
yuce0 = i - 1 - sum[i-1]; //[1,i-1]区间有多少个0
yuce = yuce1 + yuce0;
if( yuce >= Max)
{
Max = yuce;
yi = a;
}
}
cout << yi;
return 0;
}
提交截图

该代码实现了一个算法,通过前缀和和集合去重处理区间内0和1的个数,以找到最大预测正确次数的安全指数yi。首先对数据进行排序,然后计算挂科情况的前缀和,接着遍历区间,统计未挂科和挂科的预测次数,找到最大值。

被折叠的 条评论
为什么被折叠?



