成绩统计
- ==问题描述==
- ==格式输入==
- ==格式输出==
- ==样例输入==
- ==样例输出==
- ==评测用例规模与约定==
- ==解析==
- ==参考程序==
- 难度等级
问题描述
题目有问题方差定义那加平方(vi-v)
格式输入
输入的第一行包含三个正整数n,k,T ,相邻整数之间使用一个空格分隔。
第二行包含n个正整数a1,a2,··· ,an ,相邻整数之间使用一个空格分隔
格式输出
输出一行包含一个整数表示答案。如果不能满足条件,输出−1
样例输入
5 3 1
3 2 5 2 3
样例输出
4
评测用例规模与约定
对于10%的评测用例,保证1≤n,k≤10^2 ;
对于30%的评测用例,保证1≤n,k≤10^3 ;
对于所有评测用例,保证1≤n,k≤10^5 ,1≤T ≤2^31−1,1≤ai≤n 。
解析
二分可过全部,不用暴力只能30%;
参考程序
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=100010;
__int128 k,T;
ll a[N];
__int128 b[N];
__int128 s1[N],s2[N];
bool check(int m)
{
for(int i=1;i<=m;i++)b[i]=a[i];
sort(b+1,b+m+1);
for(int i=1;i<=m;i++)
{
s1[i]=s1[i-1]+b[i];
s2[i]=s2[i-1]+b[i]*b[i];
}
__int128 lim=k*k*T;
for(int i=k;i<=m;i++)
{
__int128 sum=k*(s2[i]-s2[i-k])-(s1[i]-s1[i-k])*(s1[i]-s1[i-k]);//推公式
if(sum<lim){return true;}
}
return false;
}
int main()
{
int n;
long long k1,T1;
cin>>n>>k1>>T1;
k=k1,T=T1;
for(int i=1;i<=n;i++)cin>>a[i];
int l=k-1,r=n+1;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid))r=mid;else l=mid;
}
cout<<(r<=n?r:-1);
return 0;
}
难度等级
⭐️⭐️⭐️⭐️(1~10星)想完全过还是挺难的
以个人刷题整理为目的,如若侵权,请联系删除~