UOJ_21_【UR #1】缩进优化_数学

题面:http://uoj.ac/problem/21



最小化$\sum\limits{i=1}^{n}a[i]/x+a[i]\;mod\;x$

=$\sum\limits{i=1}^{n}(1-x)*(a[i]/x)+a[i]$

=$\sum\limits{i=1}^{n}a[i]-\sum\limits{i=1}^{n}(x-1)*a[i]/x$

直接枚举x,然后对于0~x-1这部分贡献是0,x~2x-1这部分贡献是1。

按x分块计算即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long ll;
#define N 2000050
inline char nc() {
	static char buf[100000],*p1,*p2;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
int rd() {
	int x=0; char s=nc();
	while(s<‘0‘||s>‘9‘) s=nc();
	while(s>=‘0‘&&s<=‘9‘) x=(x<<3)+(x<<1)+s-‘0‘,s=nc();
	return x;
}
int n,a[N],s[N],mx;
ll solve(int x) {
	ll re=0;
	int i;
	for(i=x;i<=mx;i+=x) {
		re+=ll(i/x)*(s[i+x-1]-s[i-1]);
	}
	return re*(x-1);
}
int main() {
	n=rd();
	int i;
	ll sum=0,ans=0;
	for(i=1;i<=n;i++) a[i]=rd(),mx=mx<a[i]?a[i]:mx,sum+=a[i],s[a[i]]++;
	int lim=mx<<1;
	for(i=1;i<=lim;i++) s[i]+=s[i-1];
	for(i=1;i<=mx;i++) ans=max(ans,solve(i));
	printf("%lld\n",sum-ans);
}

原文地址:https://www.cnblogs.com/suika/p/9463095.html

时间: 2024-08-15 05:37:22

UOJ_21_【UR #1】缩进优化_数学的相关文章

C编译器剖析_5.1 中间代码生成及优化_简介

5.1  中间代码生成与优化_简介 在语法分析和语义检查阶段,我们始终在与语句Statement.表达式Expression和外部声明ExternalDeclaration这3个概念打交道.通过声明,我们最终建立起了相应的类型结构,并在符号表中保存了相关标识符的类型信息,到了中间代码生成阶段,我们就不再需要处理外部声明ExternalDeclaration了,只需要为语句和表达式生成相应的中间代码即可.文件ucl\tranexpr.c用于为表达式生成中间代码,文件名tranexpr是Transl

C编译器剖析_5.1 中间代码生成及优化_布尔表达式的翻译

5.2  中间代码生成与优化_布尔表达式的翻译 我们仍然按照语法分析和语义检查时的思路,先讨论表达式的翻译,再处理语句.表达式从概念上来说,可分为算术表达式和布尔表达式,在一些编程语言(例如Java)中对这两者是有严格区分的,算术表达式的结果是整数或浮点数,而布尔表达式的结果是逻辑上的真或假.布尔是英国数学家,由于布尔较早进行了关于"与或非"逻辑运算的研究,为了纪念这位先驱,在Java中引入了关键字boolean,而在C++中引入了bool关键字来表达逻辑上的真或假.C语言中并没有专门

【UOJ#21】【UR#1】缩进优化

我好弱啊,什么题都做不出来QAQ 原题: 小O是一个热爱短代码的选手.在缩代码方面,他是一位身经百战的老手.世界各地的OJ上,很多题的最短解答排行榜都有他的身影.这令他感到十分愉悦. 最近,他突然发现,很多时候自己的程序明明看起来比别人的更短,实际代码量却更长.这令他感到很费解.经过一番研究,原来是因为他每一行的缩进都全是由空格组成的,大量的空格让代码量随之增大. 现在设小O有一份 n 行的代码,第 i 行有 ai 个空格作为缩进. 为解决这一问题,小O要给自己文本编辑器设定一个正整数的默认TA

UOJ#21【UR #1】缩进优化

传送门 http://uoj.ac/problem/21 枚举 (调和级数?) $\sum_{i=1}^{n} (a_i / x + a_i \bmod x) =\sum a_i - (\sum_{i=1}^{n} a_i /x) * (x-1)$ 看上去并没有一个很好的办法确定x的取值? 大概只能暴力枚举了. 枚举x的大小,如果用分块加速的方法统计解,复杂度是O(n)+O(n/2)+O(n/3)+O(n/4)+... 累积起来是O(nlogn) 嗯?好像是正解? イミワカナイ 1 #inclu

软件测试_Loadrunner_APP测试_性能测试_脚本优化_脚本回放

本文主要写一下在使用Loadrunner录制完毕APP脚本之后如何对脚本进行回放,如有不足,欢迎评论补充. 如没有安装Loadrunner软件,请查看链接:软件测试_测试工具_LoadRunner: 如不清楚如何使用Loadrunner录制APP脚本,请查看链接:软件测试_APP测试_性能测试_脚本录制_基本操作流程: 先决条件:已录制完毕APP操作脚本.(我这里是录制了上传图片并查询的操作) 一.录制完毕脚本之后,点击保存.就能进入脚本优化界面,如下图: 二.然后点击上部菜单栏中的Script

手机卫士05_背景资源_listview优化_进程查看

1.1添加黑名单的ui 拦截类型修改为一组RadioGroup,里面三个RadioButton,RadioGroup可以指定排列方式 其它的都简单,记得定义好ID,顺便抽取点样式就可以了,最后两个Button可以设置状态选择器. 如果不确定LinearLayout有多高,就设置为0dp,权重为1,这样它会自己去填充空白,而不是覆盖. 1.2 电话号码的文本输入框 1.2.1安卓下特殊的图片资源 .9.png 图片 安卓自带的工具:sdk-tools-draw0-pathch 如果是在两侧选定黑点

Java性能优化_转载

一.避免在循环条件中使用复杂表达式 1.在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 2.不可使用多层循嵌套. 二.集合大小 jvm为vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收.可见vector容量的扩大是一个颇费时间的事. 通常,默认的10个元素大小是不够的,你最好能准确的估计你所需要的最佳大小. array 数组效率最高,但容量固定,无法动态改变,A

Unity3D安卓开发优化_强制控制分辨率

目前学习应用性能优化最直接的方法就是降低分辨率. 一般3D场景在电脑运行没问题,一进手机就卡成放PPT了. 针对特定设备可以限制分辨率. 性能优化有很多方面,这次主要是分辨率,很简单,一句代码 Screen.SetResolution(high,width,true); 这里有一个要主注意就是固定了分辨率后在不同设备上运行会出现问题. 这个得研究研究,看看得到屏幕原始分辨率,再通过一定比例缩小,估计可以.

C编译器剖析_5.4.2 中间代码生成及优化_基本块的合并

5.4.2  基本块的合并 我们在第5.4.1节时给出了由基本块构成的双向链表和控制流图,为阅读方便,我们这里再次给出"图5.1.4 基本块的静态结构和动态结构".在这一小节中,我们试图把双向链表中相邻的基本块进行合并,当然这种合并需要满足一定条件,同时要保持程序的原有语义.在合并后,控制流图中的前驱与后继关系也要进行调整.我们需要改动的数据结构有图5.4.1中的双向链表和控制流图.需要注意的是,虽然基本块BB5和BB6在双向链表中相邻,但控制流却不会由BB5流入BB6,双向链表只是维