有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:
fun(A)
sum = 0
for i = 1 to A.length
for j = i+1 to A.length
sum = sum + Floor((A[i]+A[j])/(A[i]*A[j]))
return sum
给出数组A,由你来计算fun(A)的结果。例如:A = {1, 4, 1},fun(A) = [5/4] + [2/1] + [5/4] = 1 + 2 + 1 = 4。
Input
第1行:1个数N,表示数组A的长度(1 <= N <= 100000)。 第2 - N + 1行:每行1个数A[i](1 <= A[i] <= 10^9)。
Output
输出fun(A)的计算结果。
Input示例
3 1 4 1
Output示例
4
李陶冶 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里
这题刚开始傻傻的照着题目copy代码然后交上去超时了,然后经过一番观察,发现此题只和1、2有关,所以我先遍历一遍,有f1个1,f2个2,然后慢慢推导出一个公式 ans=2*(1+2+3+...+(f1-1))+(1+2+...+(f2-1))+n*f1 - f1*f1; 当然,代码中ak是可以在for中执行的,此代码还能优化,我懒。
#include<iostream>
using namespace std;
int f1=0,f2=0;
int ak(int a)
{
int sum=0;
for(int i=a-1;i>0;i--)
sum+=i;
return sum;
}
int main()
{
int n,temp,i,sum=0;
cin>>n;
for( i=1;i<=n;i++)
{
cin>>temp;
if(temp==1)
f1++;
if(temp==2)
f2++;
}
cout<<2*ak(f1)+ak(f2)+n*f1-f1*f1;
return 0;
}