poj3258解题报告

来源:互联网 发布:阿狸电视直播软件 编辑:程序博客网 时间:2024/06/17 01:44

这是一道二分的题目,题目大概意思:一些石头排成一条线,第一个和最后一个不能去掉,其余的共可以去掉m块,要使去掉后石头间距的最小值达到最大。

没想到思路。。。。去看的别人的思路

统计当前中界mid为最小间距的情况下下,要丢多少个石头,然后在与m比较,相应的改变上下界

注意就是m与中界丢的石头数相等时,也不一定是最小距离,需要继续比较(因为不是mid直接和m比较,想想为什么!!)

14293038    h123120    3258    Accepted    432K    407MS    C++    1022B    2015-06-14 15:02:37

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int l,n,m;int main(){    while(cin>>l>>n>>m)    {        int* dist=new int[n+2];        dist[0]=0;        dist[n+1]=l;        int low=l;        int high=l;        for(int i=1; i<=n; i++)            cin>>dist[i];        sort(dist,dist+n+2);        for(int i=1; i<=n+1; i++)        {            low=min(low,dist[i]-dist[i-1]);        }        while(low<=high)        {            int mid=(high+low)/2;            int s_cnt=0,d_cnt=0;            for(int i=1; i<=n+1;)//统计以当前mid的为最小长度,要丢多少个石头            {                if((d_cnt+=dist[i]-dist[i-1])<=mid)                {                    s_cnt++;                    i++;                }                else                {                    i++;                    d_cnt=0;                }            }            if(s_cnt<=m)  low=mid+1;//正确的值在low这边 ,等于但mid不一定是最大            else  high=mid-1;        }        cout<<low<<endl;        delete dist;    }}



0 0
原创粉丝点击