博客
关于我
最佳解答
阅读量:323 次
发布时间:2019-03-04

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

最佳解答 ⁡ \operatorname{最佳解答}

题目链接: /

题目

在这里插入图片描述

输入

在这里插入图片描述

输出

在这里插入图片描述

样例输入

3588

样例输出

6

样例数据

TAB 的长度为 4 4 4 的时候,答案是 1 + ( 5 − 4 ) + 2 + ( 8 − 8 ) + 2 + ( 8 − 8 ) = 6 1+(5-4)+2+(8-8)+2+(8-8)=6 1+(54)+2+(88)+2+(88)=6

数据范围

在这里插入图片描述

大数据

思路

这道题是一道数学题,不过可以用三分来做。

我这里讲数学方法,三分的博客等我们这里有人做出来,我把链接贴在这里。

我就化公式:(这里的除号都是整除, m i n ( ) min() min() 就是枚举 x x x 然后统计最小值)

(不太会写公式,见谅)
m i n ( ∑ i = 1 n ( ( a i / x ) + ( a i % x ) ) ) min(\sum\limits_{i=1}^{n}((a_i/x)+(a_i\%x))) min(i=1n((ai/x)+(ai%x)))
m i n ( ∑ i = 1 n ( ( a i / x ) + ( a i − a i / x × x ) ) ) min(\sum\limits_{i=1}^{n}((a_i/x)+(a_i-a_i/x\times x))) min(i=1n((ai/x)+(aiai/x×x)))
m i n ( ∑ i = 1 n ( a i / x + a i − a i / x × x ) ) min(\sum\limits_{i=1}^{n}(a_i/x+a_i-a_i/x\times x)) min(i=1n(ai/x+aiai/x×x))
m i n ( ∑ i = 1 n ( a i − a i / x × ( x − 1 ) ) ) min(\sum\limits_{i=1}^{n}(a_i-a_i/x\times (x-1))) min(i=1n(aiai/x×(x1)))
m i n ( ∑ i = 1 n a i − ∑ i = 1 n ( a i / x × ( x − 1 ) ) ) min(\sum\limits_{i=1}^{n}a_i-\sum\limits_{i=1}^{n}(a_i/x\times (x-1))) min(i=1naii=1n(ai/x×(x1)))
m i n ( ∑ i = 1 n a i − ∑ i = 1 n ( a i / x ) × ( x − 1 ) ) min(\sum\limits_{i=1}^{n}a_i-\sum\limits_{i=1}^{n}(a_i/x)\times (x-1)) min(i=1naii=1n(ai/x)×(x1))

∑ i = 1 n a i \sum\limits_{i=1}^{n}a_i i=1nai 可以预处理,但是 ∑ i = 1 n ( a i / x ) \sum\limits_{i=1}^{n}(a_i/x) i=1n(ai/x) 怎么办呢?

我们有一种方法:
我们预处理出大于等于 i i i 的数有多少个,我这里用 b [ i ] b[i] b[i] 来存。
然后我们枚举当前枚举的 x x x 的倍数,看有多少个数超过了 x x x 的这个倍数,加进一个数组里面。最后这个数组里面存的数就是答案了。
为什么呢?
因为我们可以发现,如果 a / x = b a / x = b a/x=b ,那它其实就对答案贡献了 b b b 次,那其实就是答案咯。

代码

#include
#include
#include
#define ll long long#define rr registerusing namespace std;ll n, a[1000001], xr, sum, ans, tmp[1];ll b[1000001];ll read() { //快读 ll an = 0, zhengfu = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') zhengfu = -zhengfu; c = getchar(); } while (c >= '0' && c <= '9') { an = an * 10 + c - '0'; c = getchar(); } return an * zhengfu;}int main() { // freopen("text.txt", "r", stdin); memset(tmp, 0x7f, sizeof(tmp));//初始化 ans = tmp[0]; n = read();//读入 for (rr ll i = 1; i <= n; i++) { a[i] = read();//读入 sum += a[i];//求出a[i]的和 b[a[i]]++;//记录 xr = max(xr, a[i]);//求出最大值 } for (rr ll i = xr - 1; i >= 1; i--)//求出有多少个大于i的数,用b[i]储存 b[i] += b[i + 1]; for (rr ll i = 1; i <= xr; i++) { //枚举x ll now = sum; ll minus = 0; for (rr ll j = i; j <= xr; j += i)//算公式 minus = minus + b[j]; now -= minus * (i - 1); ans = min(ans, now);//找到答案最小的那个 } printf("%lld", ans);//输出 return 0;}

转载地址:http://ozvh.baihongyu.com/

你可能感兴趣的文章
函数指针的典型应用-计算函数的定积分(矩形法思想)
查看>>
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
查看>>
用 wxPython 打印你的 App
查看>>
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
查看>>
android:使用audiotrack 类播放wav文件
查看>>
vue通过better-scroll 封装自定义的下拉刷新组件
查看>>
android解决:使用多线程和Handler同步更新UI
查看>>
十大排序算法之三:插入排序(Python)
查看>>
合并两个有序数组
查看>>
聊聊我的五一小假期
查看>>
CSS position属性static/relative/absolute/fixed/sticky用法总结
查看>>
Java纯文本文件显示工具制作
查看>>
LeetCode:28. 实现 strStr()——————简单
查看>>
Lionheart万汇:布林线双底形态分析技巧
查看>>
数据库三个级别封锁协议
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
方法重写
查看>>
Threading Programming Guide(多线程编程指南)
查看>>
Java求逆波兰表达式的结果(栈)
查看>>
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
查看>>