【Cardboard for Pictures】

题意:

Mircea有n张照片,第 i 张照片的是边长为si的正方形,他把每张照片都装在一块正方形的硬纸板上,这样每张照片的四周都有一个w厘米的硬纸板边框。他总共用了 c 立方厘米见方的硬纸板。给定图片大小和值c,求w。(请注意,每张图片后面都有一块纸板,而不仅仅是边框。)

【Cardboard for Pictures】_第1张图片

输入:第一行 t  (1≤t≤1000)组数据 ;

           第二行 n (1≤n≤2⋅10^5),c (1≤c≤10^18)

           第三行n个照片的边长si (1≤si≤10^4) 

输出:w

 输入样例

10
3 50
3 2 1
1 100
6
5 500
2 2 2 2 2
2 365
3 4
2 469077255466389
10000 2023
10 635472106413848880
9181 4243 7777 1859 2017 4397 14 9390 2245 7225
7 176345687772781240
9202 9407 9229 6257 7743 5738 7966
14 865563946464579627
3654 5483 1657 7571 1639 9815 122 9468 3079 2666 5498 4540 7861 5384
19 977162053008871403
9169 9520 9209 9013 9300 9843 9933 9454 9960 9167 9964 9701 9251 9404 9462 9277 9661 9164 9161
18 886531871815571953
2609 10 5098 9591 949 8485 6385 4586 1064 5412 6564 8460 2245 6552 5089 8353 3803 3764

输出样例

1
2
4
5
7654321
126040443
79356352
124321725
113385729
110961227

 

 


思路:首先减去每个照片占用的硬纸板面积S,总面积c减去S得到边框的面积,c=c-S,第 i 个照片边框的面积=(si+2w)*(si+2w)-si*si=c;化简得 w*si+w*w=c/4; sum=\sum_{1}^{n}si;总边框的面积为 w*sum+n*w*w=c/4。二分w找答案。

#include
#include
using namespace std;
typedef long long LL;
const int N=2e5+10;
int s[N];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
	    LL n,c;
	    LL sum=0;
		scanf("%lld %lld",&n,&c);
		for(int i=0;i>1;
			//w*sum+n*w*w=c,两边同时除以w,防止数据过大  
			if(n*mid+sum==c/mid)
			{
				ans=mid;
				break;
			}
			else if(n*mid

 4w*w*n+4sum*w=c 配方得(2nw+sum)*(2nw*sum)=cn+sum*sum,化简得w=sqrt(cn+sum*sum)-sum/2/n;

#include
#include
#include
using namespace std;
typedef long long LL;
const int N=2e5+10;
double s[N];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
	    LL n;
		double c;
	    double sum=0;
		scanf("%lld %lf",&n,&c);
		for(int i=0;i

 

你可能感兴趣的:(算法)