
T145120 最佳解答
发布日期:2021-05-07 22:46:34
浏览次数:14
分类:精选文章
本文共 1075 字,大约阅读时间需要 3 分钟。
题目
解
n方暴力,优化了些许变nlog(n)。
n方: 枚举TAB的长度,逐行计算长度 nlog(n): 枚举TAB的长度,与其的倍数。两个前缀和分别记录某个值到某个值中出现a[i]的数量,和a[i]值的总和。然后计算一下即可。代码
#include#include #include #include using namespace std;long long n,a[10000001],sl[30000001],sum[10000001],lll,sll,ans,lans,maxx;long long read(){ long long ll = 0; char c = getchar(); while(c > '9' || c < '0') c = getchar(); while(c <= '9' && c >= '0') { ll = ll * 10 + c - 48; c = getchar(); } return ll;}int main(){ scanf("%lld",&n); for(long long i = 1; i <= n; ++i){ a[i] = read(); ++sl[a[i]]; ans += a[i]; } sort(a+1, a+1+n); maxx = a[n]; for(int i = 1; i <= maxx * 2; ++i) //记录值的和 sum[i] = sum[i-1] + sl[i] * i; for(int i = maxx; i; --i) //记录此数后面有多少个数 sl[i] += sl[i+1]; for(long long k = maxx; k; --k){ lans = sum[k - 1] - sum[0]; for(long long i = k; i <= maxx; i += k){ lll = i / k; //这些数都能除以lll个k sll = sl[i] - sl[i + k]; //这些数的数量 lans += lll * sll + (sum[i + k - 1] - sum[i - 1]) - i * sll; //TAB大小+剩余的空格 } ans = min(ans, lans); } printf("%lld",ans); }
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月30日 00时56分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
androidstudio同步的时候下载jcenter的库出错解决办法
2021-05-08
ButterKnife使用问题
2021-05-08
React学习笔记(一)
2021-05-08
低代码平台快速开发小程序
2021-05-08
vue学习笔记
2021-05-08
低代码后续发展路线图
2021-05-08
MobX 学习 - 04 TodoList 案例
2021-05-08
MobX 学习 - 06 异步任务、rootStore、数据监测
2021-05-08
react: antd 中 table 排序问题
2021-05-08
FPGA学习网站推荐
2021-05-08
LeetCode:100. Same Tree相同的树(C语言)
2021-05-08
【个人网站搭建】GitHub pages+hexo框架下为next主题添加分类及标签
2021-05-08
GDB命令—jump/return/call/disassemble
2021-05-08
java基础--继承
2021-05-08
java基础--java内部类
2021-05-08
fastjson 反序列化源码解析
2021-05-08
按位与、或、非、异或总结
2021-05-08
TCP心跳检测包
2021-05-08
01 背包问题
2021-05-08