CF570B
题意转化:
一条长为n的路,路上有一点m,问你在什么地方再设一点a可以使路上任意一点到点a的概率大于到点m的概率
所谓概率更大,也就是说从离点m更远的一端到点a的长度小于到点m的长度
(因为此长度内所有的点到a的距离都小于到m的距离)
具体做法如下
-
因为这道题的点都是整数,所以先特判一下,当n=1时输出1(路的长度就为1,m<=n,所以m也只能为1,因此必不可能出现一点a使得这个端点到a的距离小于m,只能等于,此时概率为0,就愉快的输出1就好了)
-
对于长度不是1的道路,我们做如下处理:
因为上面说了是要使从离m更远的一端到m的距离大于到a的距离
即
我们把道路的中点mid看做一个分界点,当m处于[0,mid]中时,a要属于(m,n]才能使端点到a的距离更小,且当a与m的差值为1时(即a=m+1),才能使所谓的概率更大
同理,当m处于[mid,n]时,a要属于[0,mid)且a=m-1才能使概率更大
因为长度什么的都是整数,对于除法运算有限制,所以分奇数和偶数两种情况写(注意不要忘记考虑m正好位于中点的情况)
代码
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,m;
int main(){
cin>>n>>m;
if(n==1){cout<<1;return 0;}
if(n%2==0&&m>n/2) cout<<m-1;
if(n%2==0&&m<=n/2) cout<<m+1;
if(n%2!=0&&m>=n/2+1) cout<<m-1;
if(n%2!=0&&m<n/2+1) cout<<m+1;
return 0;
}
码风丑勿喷