C. Annoying Present (Thinking + Mathematics)

https://codeforces.com/problemset/problem/1009/C


Idea: At first glance, I thought it was dichotomy. But it was not right.

There should be a greedy choice at every point.

It can be found that x cannot be changed at each fixed increment. It can only be d. The total multiple is the smallest when the median is placed, and the total multiple is the largest when the two ends are placed.

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
struct P{
    LL x,d;
}a[maxn];
int main(void)
{
  ///cin.tie(0);std::ios::sync_with_stdio(false);
  LL n,m;n=read();m=read();
  for(LL i=1;i<=m;i++){
     a[i].x=read();a[i].d=read();
  }
  double sum=0;
  for(LL i=1;i<=m;i++){
     if(a[i].d>=0){
        sum+=1.0*n*a[i].x+1.0*n*(n-1)/2*a[i].d;
     }
     else{
        LL t=(n+2-1)/2;
        sum+=n*a[i].x;
        LL num=0;
        if(n&1) num=1.0*(t-1)*t;
        else if(n%2==0) num=1.0*(t-1)*t+t;
        sum+=1.0*a[i].d*num;
     }
  }
  printf("%.8f\n",1.0*sum/(1.0*n));
return 0;
}

 

Guess you like

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/114937860