Educational Codeforces Round 47 (Rated for Div. 2) C. Annoying Present 数学

原题地址
Alice got an array of length
n
as a birthday present once again! This is the third year in a row!

And what is more disappointing, it is overwhelmengly boring, filled entirely with zeros. Bob decided to apply some changes to the array to cheer up Alice.

Bob has chosen
m
changes of the following form. For some integer numbers
x
and
d
, he chooses an arbitrary position
i
(
1

i

n
) and for every
j

[
1
,
n
]
adds
x
+
d

d
i
s
t
(
i
,
j
)
to the value of the
j
-th cell.
d
i
s
t
(
i
,
j
)
is the distance between positions
i
and
j
(i.e.
d
i
s
t
(
i
,
j

)

|
i

j
|
, where
|
x
|
is an absolute value of
x
).

For example, if Alice currently has an array
[
2
,
1
,
2
,
2
]
and Bob chooses position
3
for

x


1
and

d

2
then the array will become
[
2

1
+
2

2
,

1

1
+
2

1
,

2

1
+
2

0
,

2

1
+
2

1
]
=
[
5
,
2
,
1
,
3
]
. Note that Bob can’t choose position
i
outside of the array (that is, smaller than
1
or greater than
n
).

Alice will be the happiest when the elements of the array are as big as possible. Bob claimed that the arithmetic mean value of the elements will work fine as a metric.

What is the maximum arithmetic mean value Bob can achieve?

Input
The first line contains two integers
n
and
m
(
1

n
,
m

10
5
) — the number of elements of the array and the number of changes.

Each of the next
m
lines contains two integers
x
i
and
d
i
(

10
3

x
i
,
d
i

10
3
) — the parameters for the
i
-th change.

Output
Print the maximal average arithmetic mean of the elements Bob can achieve.

Your answer is considered correct if its absolute or relative error doesn’t exceed
10

6
.

Examples
inputCopy
2 3
-1 3
0 0
-1 -4
outputCopy
-2.500000000000000
inputCopy
3 2
0 2
5 0
outputCopy
7.000000000000000

排版问题就不管了)
刚开始感觉难以下手,不知道怎么处理,听完同学一说,才发现就是数学的推导:
每次都会给你 x,d 对序列每个数加上 x+d* dict( i,j ),这里的 i 是任意的;
求最后的算术平均值 max ;
化简一下:
对于这 n 个数的 sum= x*n+d*Σdict( i,j )
考虑 d 的正负问题:
①: d>=0;
那么就是 n*x+ d * ( 0+…n-1 )= n*x + d*n*(n-1)/2
②:d<0;
自然后面的越小越好;
(1)n为奇数:
中间位置为 ( n+1 )/2;
以中间位置为 i , 求和即可;
(2)n为偶数:
以 n/2 为基准,同理求和;
注: 建议使用 long long , 可能会爆 int 以及 精度问题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define maxn 200005
const int mod=1e9+7;
#define eps 1e-5
#define pi acos(-1.0)

ll quickpow(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1){
            ans=ans*a;
        }
        a=a*a;
        b>>=1;
    }
    return ans;
}
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}




int main()
{
    //ios::sync_with_stdio(false);
     ll n,m;
     cin>>n>>m;
     ll ans=0;
     for(int i=0;i<m;i++){
        ll x,d;
        cin>>x>>d;
        if(d>=0){
            ans+=n*x+d*n*(n-1)/2;
        }
        else {
            if(n%2){
                ll t=(n+1)/2;
                ans+=n*x+2*d*t*(t-1)/2;
            }
            else {
                ll t=n/2;
                ans+=n*x+n*n*d/4;
            }
        }
     }
     printf("%.7lf\n",ans*1.0/n);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值