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;
}

posted @ 2023-10-01 01:14  xlpg0713  阅读(21)  评论(0)    收藏  举报