题解 T216141 [WFOI - 01] 硬币(coin
\color{orange}\text{前言}
这是蒟蒻的第一篇题解,顺便为AC200做纪念
无耻求管理员通过
话不多说,切入正题
\color{orange}\text{题目大意}
给一些硬币,分为
\color{orange}\text{正文}
这是一道数数思维题。
因为是月赛,像我这种辣鸡是不可能做出第一题的。所以先想着骗分。所以第一步就是特判方差为数学书对方差的定义,只当
于是就轻而易举骗了
因为是月赛,
根据数学书对方差的定义,我们有一句废话:
而当每一堆硬币的数量为
试着化简这句废话,可以得到:
从而得到:
回归本题,
而此时
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
using namespace io;
const int mn=7e6+10;
const int mm=1e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int fni=0xc0c0c0c0;
int n,k;
bool f0;
int a[mn];
inline void read_init(){
n=read<int>(),k=read<int>();
for(int i=1;i<=n;i++){
a[i]=read<int>();
if(a[i]!=a[1])f0=1;
}
}
int main(){
read_init();
if(!f0){
puts("No answer!");
return 0;
}
long double ba=0;
for(int i=1;i<=n;i++)
ba+=a[i];
ba/=n;long double fc=0;
for(int i=1;i<=n;i++)
fc+=(a[i]-ba)*(a[i]-ba);
fc/=n;
double o=sqrt(k/fc);
int oo=o,ooo=o+1;
long double p=oo*oo*fc,pp=ooo*ooo*fc;
if((p-k)*(p-k)>(pp-k)*(pp-k))write(ooo,1);
else write(oo,1);
return 0;
}
此代码已省略快读快写
嗯?别走啊,现在只有
因为是月赛,还是要继续写对吧。柿子没推错,只可能爆int了。试着开让无数OIer邂逅祖宗的long long
emm...
继续开__int128
嗯?怎么还是
至于这种情况,我们得好好读一读题
你需要确定一个
\large\color{blue}\text{正整数} x ,使得每堆硬币的总金额的 方差 最接近于一个正整数k 。
说句闲话,
所以...
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
using namespace io;
const int mn=7e4+10;
const int mm=1e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int fni=0xc0c0c0c0;
ll n,k;
bool f0;
ll a[mn];
inline void read_init(){
n=read<ll>(),k=read<ll>();
for(int i=1;i<=n;i++){
a[i]=read<ll>();
if(a[i]!=a[1])f0=1;
}
}
int mian(){
read_init();
if(!f0){
puts("No anwser!");
return 0;
}
long double ba=0;
for(ll i=1;i<=n;i++)
ba+=a[i];
ba/=n;long doubel fc=0;
for(ll i=1;i<=n;i++)
fc+=1.0*(1.0*a[i]-ba)(1.0*a[i]-ba);
fc/=n;
long double o=sqrt(1.0*k/fc);
ll p=o,pp=o+1;
if(!p && pp==1){
puts("1");
return 0;
}
if(fabs(1.0*pp*pp-k/fc)<fabs(1.0*p*p-k/fc)){
write(pp,1);
return 0;
}
write(p,1);
return 0;
}
此代码已省略快读快写
可能不止改动了快读快写(