CF1850E 题解
题意简介:你有 \(n\) 张正方形照片,第 \(i\) 张照片的边长为 \(s_i\)。现在每一张照片都有一个宽为 \(x\) 的边框。现在已知所有照片和边框的面积和 \(c\)。求出 \(x\)。
考虑数学解法。一张边长为 \(s\) 的边框宽为 \(x\) 的照片所占据的面积应为 \((s+2x)^2\) 化简得 \(s^2+4sx+4x^2\)。
由于 \(s\) 已知,我们可以得到关于 \(x\) 的二元一次方程: \(\sum\limits_{i=1}^ns_i^2+4s_ix+4x^2=c\)。
再化简得:\(4nx^2+\sum\limits_{i=1}^n4s_ix+(\sum\limits_{i=1}^ns_i^2-c)=0\)。
对其进行方程求解即可。
#include<bits/stdc++.h>
#define int __int128//这种做法不开__int128会寄
using namespace std;
int n, t, c, s, p, q; // px^2 + qx = c
void scan(__int128 &x){
x = 0;
int f = 1;
char ch;
if((ch = getchar()) == '-') f = -f;
else x = x*10 + ch-'0';
while((ch = getchar()) >= '0' && ch <= '9')
x = x*10 + ch-'0';
x *= f;
}
void print(__int128 x){
if(x < 0) {
x = -x;
cout << '-';
}
if(x > 9) print(x/10);
putchar(x%10 + '0');
}
inline void solve(){
scan(n); scan(c); p = q = 0;
for(int i = 1; i <= n; i++){
scan(s); c -= s * s;
p += 4; q += 4 * s;
}
c /= 4; p /= 4; q /= 4;
int ans = (int)((-q+sqrt(double(q*q+4*p*c)))/(2*p));//带入求解公式
print(ans); cout << '\n'; return;
}
signed main(){
scan(t);
while(t--)solve();
return 0;
}

浙公网安备 33010602011771号