POJ3244(工科数学分析)
生活随笔
收集整理的這篇文章主要介紹了
POJ3244(工科数学分析)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:http://poj.org/problem?id=3244
?
題意:給定n個三元組,對于任意兩個三元組,設和,定義:
?
,求所有無序對的和。
?
?
分析:首先我們要知道:
?
?
簡單分析一下這個結果是怎么得來的:
?
如果,那么:
?
?
?
這是一種情況,還有兩種情況也是這個結果。所以結果成立。
?
那么我們分開計算三部分的和,然后除2就可以了。
?
觀察一下,比如對于長度為5的數組A[]計算就應該是:先排序,然后累加
A[1]-A[0]+A[2]-A[0]+A[3]-A[0]+A[4]-A[0]
A[2]-A[1]+A[3]-A[1]+A[4]-A[1]
A[3]-A[2]+A[4]-A[3]
A[4]-A[3]
?
把它們加起來就應該是:sum=(-4*A[0])+(A[1]-3*A[1])+(2*A[2]-2*A[2])+(3*A[3]-A[3])+(4*A[4])
?
考慮長度為n的數組A[],那么sum就應該這樣計算:
for i 0 to n-1
?? begin
?????? sum += (i*A[i] - (n-1-i)*A[i]);
?? end;
?
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h>using namespace std; typedef long long LL; const int N = 250000;LL a[N],b[N],c[N]; int n;void Import() {LL x,y,z;for(int i=0;i<n;i++){scanf("%I64d%I64d%I64d",&x,&y,&z);a[i] = y-x;b[i] = z-y;c[i] = z-x;}sort(a,a+n);sort(b,b+n);sort(c,c+n); }void Work() {LL sum = 0;for(int i=0;i<n;i++){sum += i*a[i] - (n-1-i)*a[i];sum += i*b[i] - (n-1-i)*b[i];sum += i*c[i] - (n-1-i)*c[i];}printf("%I64d\n",sum>>1); }int main() {while(~scanf("%d",&n)){if(n==0) break;Import();Work();}return 0; }
?
?
總結
以上是生活随笔為你收集整理的POJ3244(工科数学分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ2236(并查集)
- 下一篇: 关于landau函数