思路: 看到(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;
}