题解:P13817 「LDOI R3」球球碰撞
题解:P13817 「LDOI R3」球球碰撞
二次函数题。
令 \(v_1 \neq v_2 \neq v_3 \neq \cdots \neq v_n\)。此时我们直接求函数图像的交点。因为所有元素互不相同,所以不存在两条没有交点的直线。
所以答案即为 \(\sum_{i=0}^{k-1} i\)。用高斯公式可得:
\[\sum_{i=0}^{k-1} i = \frac{k(k-1)}{2}
\]
接下来考虑存在一组下标 \(i,j\),使得 \(a_i = a_j\)。此时将其放在不同方向上,那么仍然可以碰撞。
令数列中有 \(m \ (m \ge 3)\) 个元素相同,当 \(m = 3\) 时,显然会存在速度和方向都一样的小球,所以碰撞次数要减掉。令其中有 \(n\) 个方向相同,\(m-n\) 个方向不同,所以有函数:
\[y=n(m-n)=-n^2+mn
\]
将其看作关于 \(n\) 的二次函数,根据顶点式 \(\left(-\frac{b}{2a},\frac{4ac-b^2}{4a} \right)\),可得函数最大值为:
\[y_{\max} = \frac{4ac-b^2}{4a} = \frac{-m^2}{-4} =\frac{m^2}{4}
\]
所以碰撞数减少了:
\[\left(\sum_{i=0}^{m-1} i \right)- y_{\max} = \frac{m(m-1)}{2}- \frac{m^2}{4}
\]
所以答案即为:
\[\left(\sum_{i=0}^{k-1} i \right)- \left(\sum_{i=0}^{m-1} i \right) +y_{\max} = \frac{k(k-1)}{2} - \frac{m(m-1)}{2} + \frac{m^2}{4}
\]
化简为:
\[\frac{k(k-1)-m(m-2)}{4}
\]
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll T,n,a[N];
int main(){
cin>>T;
while(T--){
cin>>n;
ll sum=(n*(n-1))/2;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n); //排序,方便使用求和公式;
for(int i=1;i<=n;i++){
ll temp=a[i],cnt=0;
for(int j=i;j<n&&a[j]==temp;j++){ //注意边界
cnt++;
} //因为顶点坐标是 (n/2,m^2/4),所以也可以代入横坐标求最值:
sum-=cnt*(cnt-1)/2-(cnt/2)*(cnt-(cnt/2));
i=i+cnt-1;
}
cout<<sum<<"\n";
}
return 0;
}