<题目>
<算法>
二分
<分析>
看起来题目挺奇葩的。关键点在于判断的是奇偶,而且只有一处是奇数。利用奇偶数的性质,奇数点后面的数的前缀和全部都是奇数。利用这一性质我们就可以进行二分。
<注意>
用Long Long 比较保险
<代码>
#include
#include
#include
#include
#include
using namespace std; #define MAXN 50100 #define EPS 0.1 double x[MAXN],w[MAXN]; int n,testcase; double calc(double s) { double ans=0; for (int i=1;i<=n;i++) ans+=fabs(x[i]-s)*fabs(x[i]-s)*fabs(x[i]-s)*w[i]; return ans; } double Sanfen(double left,double right) { while (right-left>EPS) { double ll=(left+(right-left)/3),rr=(ll+(right-left)/3); double llAns=calc(ll); double rrAns=calc(rr); if (llAns
right) right=x[i]; } double ans=Sanfen(left,right); ans=calc(ans); printf("Case #%d: %d\n",p,(int)(ans+0.5)); } }