题目链接: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相关推荐

  1. problem solving automation

    分工一定要明确啊啊啊啊啊 Nero 数据结构  图论   DP   博弈 JayYe  数论   DP   模拟搜索 博弈  wuyiqi 数论  数据结构   图论 字符串 模拟搜索  几何  20 ...

  2. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

  3. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...

  4. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  5. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  6. 逆序数 UVALive 6508 Permutation Graphs

    题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...

  7. Infinite Fraction Path UVALive - 8207

    Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...

  8. F - Heron and His Triangle UVALive - 8206

    F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...

  9. Tree UVALive - 8212

    Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所 ...

最新文章

  1. J2ee分布式框架--技术介绍文档
  2. 【转】sql server开启全文索引方法
  3. 三星 Nexus S刷MIUI ROM最新图文刷机教程
  4. Python:给定一个不超过5位的正整数,判断有几位
  5. java不使用除号实现除法运算_LeetCode29 Medium 不用除号实现快速除法
  6. 程序员基本功 06 流程控制的陷阱
  7. Linux ALSA 图解
  8. php 回调通知 连连支付_连连支付,或微信或支付宝支付,商品名称最后一个字乱码,php解决...
  9. centos7 离线安装自签名harbor
  10. java遍历日期_Java遍历起止日期中间的所有日期操作
  11. linux cadence快捷键,如何设置Cadence 16.6中PCB Editor的快捷键
  12. 关于U-Net结构的更浅显更易懂的解释
  13. 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
  14. CAN总线波特率的计算方法
  15. WPS文字教你制作米字本即用于临摹练字的米字格
  16. win10卸载软件_WIN10系统如何关闭/卸载自带杀毒软件
  17. 在wamp 或者xamp 下测试多个独立的网页文件
  18. 江苏工勤计算机高级工职称,事业单位专业技术职称与工勤岗高级工的区别
  19. css布局——定位布局
  20. Every-SG游戏

热门文章

  1. Metro UI 的设计感悟
  2. STM32 Cortex-M3 NMI异常
  3. laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)
  4. 解决 Electron 包下载太慢问题
  5. ubuntu安装cuda(转精华)
  6. Android中ActionBar中不显示overflow(就是三个点的那个按钮)解决办法
  7. 动荡下如何自救 | 社招一年收割BATDK算法offer
  8. js已知文件路径得到file对象_NodeJs 的几种文件路径
  9. java 死锁_java死锁分析
  10. 漫谈广告竞价模式(一)