博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记
阅读量:4957 次
发布时间:2019-06-12

本文共 1216 字,大约阅读时间需要 4 分钟。

其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数。但是发现直接暴力一波就行了。
不知道有没有人会来搜到我的题解?ID是Yinku2017。

题意:求\(x\)使得\(\sum\limits_{i=1}^{n}[a_i/x]+a_i\%x\)

首先把取余运算换成减法。提公因式。

\(\sum\limits_{i=1}^{n}[a_i/x]+a_i\%x=\sum\limits_{i=1}^{n}{[a_i/x]+a_i-x[a_i/x]}=\sum\limits_{i=1}^{n}a_i+\sum\limits_{i=1}^{n}{(1-x)[a_i/x]}\)
发现什么?枚举x,根据某个n/1+n/2+n/3+...+n/n=nlogn的式子,前缀和计算出后半部分的值。恰好a_i最大就是1e6,可以这么搞,估计这道题已经设计好a_i就是1e6的。

小心溢出就可以了。

#include
using namespace std;typedef long long ll;int n;int a[1000005]={};int pa[2000005]={};int maxa=0;ll sum=0;ll minans=0;int main() {#ifdef Yinku freopen("Yinku.in","r",stdin);#endif // Yinku scanf("%d",&n); for(int i=1;i<=n;i++){ int t; scanf("%d",&t); if(t>maxa) maxa=t; sum+=t; a[t]++; } for(int i=1;i<=maxa*2;i++){ pa[i]=pa[i-1]+a[i]; } for(int d=2;d<=maxa;d++){ ll tminans=0; int c=(maxa+d-1)/d; for(int j=1;j<=c;j++){ if(j*d>maxa) break; tminans+=1ll*(pa[(j+1)*d-1]-pa[j*d-1])*j; } tminans*=(1ll-d); if(minans>tminans) minans=tminans; } printf("%lld\n",sum+minans);}

转载于:https://www.cnblogs.com/Yinku/p/10862779.html

你可能感兴趣的文章
磁盘管理
查看>>
用户管理系统
查看>>
Gym 102082B : Arithmetic Progressions
查看>>
交互式创建yum仓库脚本
查看>>
8.9
查看>>
dhcp服务脚本
查看>>
密钥对验证
查看>>
正向dns脚本
查看>>
dns等服务器搭建
查看>>
laravel soap
查看>>
MySQL 无法启动,出现 “发生系统错误 1067。”
查看>>
(android实战)实现摇一摇功能
查看>>
python 中的map,dict,lambda,reduce,filter
查看>>
二、语言基础
查看>>
[恢]hdu 1030
查看>>
hihocoder-1142-三分求极值
查看>>
SNAT、DNAT、NPT
查看>>
git 10.8
查看>>
css实现div的高度填满剩余空间
查看>>
ES6(二) Destructuring-变量的解构赋值
查看>>