2015暑假訓練題解(二分)

2021-07-03 19:01:48 字數 1987 閱讀 3109

a題 (poj2503)

這道題很容易就想到列舉,然而列舉會浪費時間。。。所以說這道題先排序,然後再二分,執行速度嗖嗖嗖~

#include#include#include#includeusing namespace std;

const int mm=100010;

struct node

dic[mm];

char t[60];

int pos;

bool cmp(node a,node b)

int binserch(char *s)

return -1;

}int main()

scanf("%s",dic[pos++].s);

}sort(dic,dic+pos,cmp);

int num=binserch(t);

if(num>=0)

printf("%s\n",dic[num].e);

else puts("eh");

while(~scanf("%s",t))

return 0;

}

b題  (hdu1007)

求平面最近點對距離的一半,同樣列舉會超時。

#include using namespace std;

const int mm=100008;

const double oo=1e100;

struct point

poin[mm];

int tmp[mm];

int m;

bool cmpxy(point a,point b) //先對x排序,再對y排序

return 0;

}

c題今天上午說過的,注意count+=floor(len[i]/x);

#include#include#include#includeusing namespace std;

#define pi acos(-1.0)

double len[10001];

int n,f;

bool get(double x)

int main()

r=(double)sum/(f+1);

while(r-l>1e-6)

printf("%.4lf\n",l);

}}

d題  (poj2456)

乙個最大值最小化的問題,先對牛之間的距離進行排序,由c頭牛可知共有c-1個距離區間,所以所求的答案d必定是小於等於相隔最遠的兩個牛的距離差除以c-1

#include#include#includeusing namespace std;

const int mm=100010;

int f[mm];

int n,c;

int main()

}if(i==n)

right=mid-1;

else

left=mid;

mid=(left+right+1)/2;

}printf("%d\n",mid);

}return 0;

}

e題 赤裸裸的最小值最大化問題……

#include #define max 100001

int day[max];

int n,m;

int main()

low = max;

high = sum;

while(low<=high)

}if(cnt<=m)

else

low = mid+1;

}printf("%d\n",max);

}return 0;

}

f、g 兩題今天跪了,明天繼續出~

二分專題題解

題目大意為給一條直線上的n個點,讓你隨意選取c個點,然後使得這c個點兩兩之間的最小距離最大,如何選取這c個點使這個最小距離最大,輸出最大的最小距離max。先把座標排序,之後界定二分的範圍,二分的縮小範圍的條件則為當兩點距離大於所輸入的點時,s 返回s。如若s大於所處的點,說明值太小,將左界變為mid...

分巧克力題解 整數二分

兒童節那天有 k 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有 n 塊巧克力,其中第 i 塊是 hi wi 的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出 k 塊巧克力分給小朋友們。切出的巧克力需要滿足 形狀是正方形,邊長是整數 大小相同 例如一塊 6 5...

2016寒假訓練 二分

poj3104 用模擬會超時,所以考慮用二分節約時間 首先分析,實際上是每一次都是去烘乾水量最大的,風乾其他的,然後烘完再排序一下,重複這一操作,直到所有的都為1。當然,模擬顯然是會超時的。所以我們這樣考慮,我們這樣考慮,如果對於乙個時間t,我們的有一部分衣服就會自然風乾,有一部分衣服需要自己來烘乾...