1. 程式人生 > >51nod 1305 Pairwise Sum and Divide(暴力 or 簡單數學)

51nod 1305 Pairwise Sum and Divide(暴力 or 簡單數學)

這裡寫圖片描述

思路: 看到(a[i] +a[j])/(a[i] * a[j]) 就想到了1/a[i] + 1/a[j]; 可能是之前寫大數寫出陰影和數學比較差把看到乘法就想到先分解,並沒想到這個化簡後的式子,a[i] ,a[j]和1、2有關。 當a[i] == 1 and a[j] == 1時 式子取證為2; 當a[i] == 1,a[j] == 其他 式子等於1; 當a[i] == 2 and a[j] == 2時,式子的值為1.

直接上暴力:

#include<iostream>
#include<algorithm>
using namespace std;
int
a[100100]; int main(){ long long int sum = 0; int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; sort(a,a+n); for(int i = 0; i < n; i++) if(a[i] == 1||a[i]==2){ for(int j = i+1; j < n; j++){ double num = (1.0 / a[i]) + (1.0
/a[j]); if((int)num < 1) break; sum += (int)num; } } cout << sum << endl; return 0; }

用上述關係優化一下

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long int ll; 
int main(){
    int n;
    cin >> n;
    int
s1 = 0,s2 = 0,sn = 0;//s1為輸入為1的值,s2為輸入為2的值,sn表示其他值 for(int i = 0; i < n;i++){ int x; cin >> x; if(x == 1)s1++; else if(x == 2)s2++; else sn++; } ll ans = (ll)(sn + s2)*s1 + (ll)s1*(s1-1) +(ll)s2*(s2 -1)/2;//這個公式就是幾個數列求和 cout << ans << endl; return 0; }