成绩统计
- ==问题描述==
- ==格式输入==
- ==格式输出==
- ==样例输入==
- ==样例输出==
- ==评测用例规模与约定==
- ==解析==
- ==参考程序==
- 难度等级
问题描述
题目有问题方差定义那加平方(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星)想完全过还是挺难的
以个人刷题整理为目的,如若侵权,请联系删除~