UVALive - 6442
题目链接:https://vjudge.net/contest/241341#problem/I
题目大意:输入t,t组样例,输入n,m,有n个圆槽,m个硬币,接下来m行代表每个硬币所在的位子,要求你移动硬币使得相邻的硬币距离相等,输出最小的最大移动步数(这里所指的是
一个硬币最大移动的步数)
个人思路:一直在找规律,后来也没有找到,应该是没有规律吧,搜题解也没有搜到有什么规律,全都是用二分来求的。。。这里怎么用二分呢?
因为数据范围是n<=1e6,并且如果通过单点最大k步移动可以是这些点两两间隔n/m,那么对于任意的k’(k’>k)也一定是可以的。所以可以二分查找需要的最小单点最大移动步数。当单点移动最大步数确定为d时如何判断d是否能使得这些点均匀分布呢?
考虑每个点的移动区间,假设第i-1个点的移动区间是[prelow,prehigh],因为第i点最多可移动d步,所以第i个点的移动区间是[data[i]-d,data[i]+d],又因为第i-1个点和第i个点需要间隔step=n/m,所以第i-1个点给第i个点的约束移动区间是[prelow+step,prehigh+step],所以第i个点的实际允许移动区间是
curlow=max(prelow+step,data[i]-d), curhigh=min(prehigh+step,data[i]+d);
只要对每个点判断这个区间是否存在即curlow<=curhigh是否成立,就能判断d是否合法了。
看代码
#include<iostream> #include<cstdio> #include<cstring> #include<stdio.h> #include<string.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> #include<map> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=2e4+10; const int maxk=100+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f int a[maxn]; int n,m,step; bool solve(int mid) {int prelow,prehigh,curlow,curhigh;prelow=a[0]-mid;prehigh=a[0]+mid;for(int i=1;i<m;i++){curlow=max(prelow+step,a[i]-mid);curhigh=min(prehigh+step,a[i]+mid);if(curlow>curhigh)return false;prelow=curlow;prehigh=curhigh;}return true; } int main() {int t,sum=1;cin>>t;while(t--){cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i];}sort(a,a+m);int l=0,r=n;step=n/m;while(l<r){int mid=(l+r)/2;if(solve(mid)){r=mid;}elsel=mid+1;}printf("Case #%d: %d\n",sum++,r);// cout<<r<<endl; } }
转载于:https://www.cnblogs.com/caijiaming/p/9386050.html
UVALive - 6442相关推荐
- problem solving automation
分工一定要明确啊啊啊啊啊 Nero 数据结构 图论 DP 博弈 JayYe 数论 DP 模拟搜索 博弈 wuyiqi 数论 数据结构 图论 字符串 模拟搜索 几何 20 ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...
- The UVALIVE 7716 二维区间第k小
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...
- UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset
UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...
- 训练指南 UVALive - 3713 (2-SAT)
layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...
- 逆序数 UVALive 6508 Permutation Graphs
题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...
- Infinite Fraction Path UVALive - 8207
Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...
- F - Heron and His Triangle UVALive - 8206
F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...
- Tree UVALive - 8212
Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所 ...
最新文章
- J2ee分布式框架--技术介绍文档
- 【转】sql server开启全文索引方法
- 三星 Nexus S刷MIUI ROM最新图文刷机教程
- Python:给定一个不超过5位的正整数,判断有几位
- java不使用除号实现除法运算_LeetCode29 Medium 不用除号实现快速除法
- 程序员基本功 06 流程控制的陷阱
- Linux ALSA 图解
- php 回调通知 连连支付_连连支付,或微信或支付宝支付,商品名称最后一个字乱码,php解决...
- centos7 离线安装自签名harbor
- java遍历日期_Java遍历起止日期中间的所有日期操作
- linux cadence快捷键,如何设置Cadence 16.6中PCB Editor的快捷键
- 关于U-Net结构的更浅显更易懂的解释
- 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
- CAN总线波特率的计算方法
- WPS文字教你制作米字本即用于临摹练字的米字格
- win10卸载软件_WIN10系统如何关闭/卸载自带杀毒软件
- 在wamp 或者xamp 下测试多个独立的网页文件
- 江苏工勤计算机高级工职称,事业单位专业技术职称与工勤岗高级工的区别
- css布局——定位布局
- Every-SG游戏