HDU 5073 Galaxy ——乱搞
【题目分析】
练习赛的T1。
只要看懂样例就可以猜结论了。
然后大胆猜测剩下的星星是一段,其余的都移到重心上去。
所以只要把计算的式子变形一下就很好维护了。
居然没有1A
【代码】
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=k;--i) #define ll long long #define maxn 50005 int t,n,k; ll a[maxn],sum[maxn],sumfac[maxn]; int main() { scanf("%d",&t); while (t--) { scanf("%d%d",&n,&k); F(i,1,n) scanf("%lld",&a[i]); if (k>=n-1){printf("0\n");continue;} sort(a+1,a+n+1); sum[0]=sumfac[0]=0; F(i,1,n) sum[i]=sum[i-1]+a[i]; F(i,1,n) sumfac[i]=sumfac[i-1]+a[i]*a[i]; double ans=1e18; k=n-k; F(i,1,n-k+1) {ans=min(ans,(double)sumfac[i+k-1]-sumfac[i-1]+(double)(sum[i+k-1]-sum[i-1])*(sum[i+k-1]-sum[i-1])/k-(double)2*(sum[i+k-1]-sum[i-1])*(sum[i+k-1]-sum[i-1])/k);} printf("%f\n",ans); } }