codeforces 303C. Minimum Modular(数论+暴力+剪枝+贪心)
You have been given n distinct integers a1, a2, ..., an. You can remove at most k of them. Find the minimum modular m (m > 0), so that for every pair of the remaining integers (ai, aj), the following unequality holds:
.
The first line contains two integers n and k (1 ≤ n ≤ 5000, 0 ≤ k ≤ 4), which we have mentioned above.
The second line contains n distinct integers a1, a2, ..., an (0 ≤ ai ≤ 10^6).
Print a single positive integer — the minimum m.
题目大意:给你n个数,你可以删掉k个,求最小的m,使得对任意i,j(i≠j)均有a[i]、a[j]对m不同余(好像不是这么表述的意思差不多就行了)
思路:从小到大枚举答案,若能成为答案则输出。那么如何判断是否答案呢?只须把n个数都求余映射到0~m的区域中,若重复肯定要删,若要删超过k次则不能成为答案。这样做大体的思路就出来了,但是算法复杂度有点大,这么做目测要跪(其实我翻过别人的TLE代码没有剪枝哈哈哈)。所以我们须要进行剪枝,具体方法为:先算出每对a[i]、a[j]的差值,存入di[]数组中,枚举答案ans的时候,差值为ans的数的余数必然有重复,这些数要删掉,若重复的数目大于k(k+1)/2,那么剪掉,因为k次删除无法得出答案。
剪枝证明:若把abs(a[j]-a[i]) == ans的看成一条边,那么就是给n条边的最小覆盖集(每条边至少有一个点要被删除)。若最多能删k个点,最多能有多少条边呢?任意选k+1个点,最多可以连k(k+1)/2条边,恰好删除k个点。注意到k很小,所以此剪枝效果应该不差。
#include <cstdio>
#include <algorithm> #define MAXN 1000010 int a[MAXN], di[MAXN], vis[MAXN];
int n, k; int check(int m){
int cnt = ;
for(int i = ; i < n; ++i){
if(vis[a[i]%m] == m && ++cnt > k) return false;
vis[a[i]%m] = m;
}
return true;
} int main(){
scanf("%d%d",&n,&k);
for(int i = ; i < n; ++i) scanf("%d",&a[i]);
std::sort(a, a+n);
int m = a[n-] + ;
for(int i = ; i < n; ++i)
for(int j = i+; j < n; ++j)
++di[a[j]-a[i]];
int ans;
for(ans = ; ans <= m; ++ans){
int cnt = ;
for(int j = ans; j < m; j += ans) cnt += di[j];
if(cnt <= k*(k+)/ && check(ans)) break;
}
printf("%d\n", ans);
return ;
}
codeforces 303C. Minimum Modular(数论+暴力+剪枝+贪心)的更多相关文章
- CF 303C——Minimum Modular——————【剪枝】
Minimum Modular time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- D. Diverse Garland Codeforces Round #535 (Div. 3) 暴力枚举+贪心
D. Diverse Garland time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces 665C Simple Strings【暴力,贪心】
题目链接: http://codeforces.com/contest/665/problem/C 题意: 改变最少的字符,使得最终序列无相同的连续的字符. 分析: 对每一个与前一个字符相同的字符,枚 ...
- CodeForces 731F Video Cards (数论+暴力)
题意:给定 n 个数,可以对所有的数进行缩小,问你找出和最大的数,使得这些数都能整除这些数中最小的那个数. 析:用前缀和来做,先统计前 i 个数中有有多少数,然后再进行暴力去找最大值,每次都遍历这一段 ...
- 数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog
题目传送门 /* 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 详细解释:ht ...
- poj 3714 Raid【(暴力+剪枝) || (分治法+剪枝)】
题目: http://poj.org/problem?id=3714 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27048#prob ...
- codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)
题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...
- [CodeForces - 1225C]p-binary 【数论】【二进制】
[CodeForces - 1225C]p-binary [数论][二进制] 标签: 题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory limit 5 ...
- Codeforces B. Minimum Possible LCM(贪心数论)
题目描述: B. Minimum Possible LCM time limit per test 4 seconds memory limit per test 1024 megabytes inp ...
随机推荐
- 『ACM C++』 PTA 天梯赛练习集L1 | 038-039
英剧总导演真的是忙哈哈哈,需要统筹兼顾所有方面,音频组.录音组.演员表演组.道具组.等等一系列的东西,当一个团队的Leader真不容易哈哈. ----------------------------- ...
- 20181030NOIP模拟赛T2
WYT的刷子 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 1.与地面垂直,从 ...
- es6新特性之 class 基本用法
javaScript 语言中,生成实例对象的传统方法是通过构造函数,与传统的面向对象语言(比如 C++ 和 Java)差异很大,ES6 提供了更接近传统语言的写法,引入了 class(类)这个概念,作 ...
- 02.将python3作为centos7的默认python命令
博客为日常工作学习积累总结: 由于个人兴趣爱好对python有了解: 1.安装Python3: 参考博客:https://zhuanlan.zhihu.com/p/47868341 安装依赖包: yu ...
- 使用NPOI将数据导出Excel
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.IS ...
- 【EXCEL】簡単に合計をとる方法
下記のような表があるとして.合計を取るときみんなSUM関数を使用しています. その方法もよいですが.もっと簡単の方法を説明します. ①合計する部分を選択します. ②ALT+=を押します. ※ノートパソ ...
- SQL条件判断中字符串后面有空格的问题
也不知何时才有的概念,还是以前一直没有注意,从哪也没有听说过的定义,今天又遇见了一个小坑,特记录下来,防止再陷坑! 才疏学浅,文笔有限,简单点说吧,就是在写SQL Server语句时,以前使用了 WH ...
- Android Stadio配置了gralde的本地路径,但是windos 命令行还是会下载gradle
如下图: 已经在stadio 里面设置了gradle 的路径,但是在cmd 命令行里面不会去用这个路径. 解决方案:需要在环境变量里面设置一个gradle home GRADLE_USER_HOME ...
- GitHub 配置指南
Git和GitHub的区别 GitHub术语解析 配置使用 注册GitHub帐号 创建Git 创建库 复制库 社交化 Git和GitHub的区别 Git是一个分布式的版本控制系统,与SVN类似:最初由 ...
- Rails导出CSV
版本 ruby 1.9 rails 3.2 完整代码 #引入CSV标准类库 require 'csv' class PeopleController < ApplicationControl ...