51nod 1305 Pairwise Sum and Divide(暴力 or 簡單數學)
阿新 • • 發佈:2019-02-10
思路: 看到(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;
}