Yêu cầu: Chỉ sử dụng duy nhất vòng lặp và không được xài mảng. Với Max là số lớn nhất của dãy A và Min là số nhỏ nhất của dãy . Viết chương trình tính giá trị của biểu thức.
Nhận xét: Bài toán yêu cầu người dùng phải đưa ra một giải pháp "thông minh" hơn để không cần lưu tất cả các giá trị của phần tử vào mảng, nhưng vẫn tính được giá trị biểu thức. Điều này hướng ta liên tưởng tới việc rút gọn biểu thức đã cho. Cụ thể:
$$\sum\limits_{i = 0}^{n - 1}
{{{({a_i} - Max)}^2} + \sum\limits_{i = 0}^{n - 1} {{{({a_i} - Min)}^2} +
\frac{n}{2}{{(Max - \min )}^2}} } $$
$$\sum\limits_{i = 0}^{n - 1} {(a_i^2 - 2{a_i}Max + Ma{x^2}) +
\sum\limits_{i = 0}^{\_n - 1} {{{(a_i^2 - 2{a_i}Min + Mi{n^2})}^2} +
\frac{n}{2}{{(Max - \min )}^2}} } $$
2∑n−1i=0a2i−2(Max+Min)∑n−1i=0ai+n(Max2+Min2)+n2(Max−Min)
2∑n−1i=0a2i−2(Max+Min)∑n−1i=0ai+n(Max2+Min2)+n2(Max−Min)2
Vậy là sau khi rút gọn xong, biểu thức ban đầu chỉ còn phụ thuộc vào giá trị Max và Min nữa. Và việc tìm ra hai giá trị này mình nghĩ khá là đơn giản với mọi người.
Vậy là sau khi rút gọn xong, biểu thức ban đầu chỉ còn phụ thuộc vào giá trị Max và Min nữa. Và việc tìm ra hai giá trị này mình nghĩ khá là đơn giản với mọi người.
Chương trình đề xuất:
void main() { int N; scanf("%d",&N); long long TongBP,Tong;
TongBP = 0;
Tong = 0
int Max, Min; for(int i=1; i<=N; i++) { int a; scanf("%d",&a); TongBP+=1LL*a*a; Sum+=a; if (i==1) Max=Min=a; else { if (a>Max)Max=a; if (a>Min)Min=a; } } long long ans ans =2*TongBP-2*(Max+Min)*Tong + N*(Max*Max+Min*Min) + N*0.5*(Max-Min)*(Max-Min); printf("%lld",ans); }
0 nhận xét :
Đăng nhận xét