●UOJ 21 缩进优化

题链:

http://uoj.ac/problem/21

题解:

。。。技巧题吧

先看看题目让求什么:

令$F(x)=\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor +a[i]$%$x)$

要求输出最小的F(x)。

首先不难看出,x的取值不会超过最大的a[i]+1,(因为之后的答案都和x==a[i]+1时的答案相同)

把式子化为如下形式:

$F(x)=\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor +(a[i]-\lfloor a[i]/x \rfloor x))$

$\quad\quad=\sum_{i=1}^{n}(a[i]-\lfloor a[i]/x \rfloor (1-x))$

$\quad\quad=sum-\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor (1-x))$

$\quad\quad=sum+\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor (x-1))$

现在即是要找出最大的$\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor (x-1))$

然后我们令$t=\lfloor a[i]/x \rfloor$

(把a从小到大排序后)对于每一个枚举的x,

不难发现,随着a[i]的增大,t也是在单增,而且t的取值还是一段一段的。

即对于$a[i]∈ [\lambda x,(\lambda+1)x-1]  $,t的取值都是$\lambda$

所以我们可以用后缀和或者前缀和的方法对于每一个枚举的x,快速求出$\sum_{i=1}^{n}(\lfloor a[i]/x \rfloor (x-1))=\sum_{i=1}^{n}t (x-1)$

使得总复杂度为 O(NlogN)

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000050
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int cnt[MAXN];
int main(){
	int n,maxa=0; long long ans=0,tmp,sum=0;
	scanf("%d",&n);
	for(int i=1,x;i<=n;i++)
		scanf("%d",&x),cnt[x]++,maxa=max(maxa,x),sum+=x;
	for(int i=maxa-1;i;i--) cnt[i]+=cnt[i+1];
	for(int x=1;tmp=0,x<=maxa;x++){
		for(int r=1;r*x<=maxa;r++)
			tmp+=cnt[r*x];
		tmp*=(x-1);
		if(tmp>ans) ans=tmp;
	}
	printf("%lld",sum-ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/zj75211/p/8298305.html

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

●UOJ 21 缩进优化的相关文章

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

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

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

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> #i

【UOJ Round #1】

枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受…… 其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $ 也就是先将a[i]全部加起来,然后再

文顶顶 iOS开发UI篇—从代码的逐步优化看MVC

iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by a

mysql 优化例子:IN 换 INNER JOIN

今天撸代码时,遇到SQL问题: 要将A表查询的ID,匹配B表的ID,并将B表全部内容查询出来: 未优化前: MySQL [xxuer]> SELECT      ->     COUNT(*)     -> FROM     ->     t_cmdb_app_version     -> WHERE     ->     id IN (SELECT      ->             pid     ->         FROM     -> 

从代码的逐步优化看MVC

一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by apple on 14-5-25. 6 //

iOS开发UI基础—从代码的逐步优化看MVC

iOS开发UI基础-从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by

开坑UR

会做几道算几道吧…… 开个坑比较能激励自己 强迫症buff+拖延症buff rating神马的?不要在意嘛 没写的都是坑 ~~~~~萌萌哒分割线~~~~~ UR#1 1 缩进优化 2 外星人 3 跳蚤国王下江南 UR#2 1 猪猪侠再战括号序列 2 跳蚤公路 3 树上GCD UR#3 1 核聚变反应强度 2 铀仓库 3 链式反应 UR#4 1 元旦三侠的游戏 只需目测就可以发现,我们可以table[b][a] 然后除了b=1的很长之外,其它都是sqrt(n)以下的 所以可以记忆化,然后b=1时把