摘要:
题意:一条长为len(1<len<1,000,000,000)的河中,有n(1<n<50,000)块石头,移除m块,使具有最近距离的两块石头之间的距离最大。分析:二分,上界为len,下界为当前最近的石头的间距。对于二分的题目若求的是最大值,while(low <= high) ... if(check())... low=mid+1; else high=mid-1;若求的是最小值,while(low < high) ... if(check())... high=mid; else low=mid+1;答案均为 highconst int N = 5000 阅读全文
摘要:
题意:在n天里,Farmer John每天花a[i]元钱,把这些天分成连续的m份,要让最大的和尽量小,求这个和。分析:a[i]最大为max,总和为sum,则答案一定在max到sum之间。二分答案ans,遍历a[],若能将a[]分成m份,每份的总和<=ans,则ans为一个可行解,若ans可行,ans-1不可行,则ans为最终答案。const int N = 100005;int a[N];int n, m, low, high;bool check(int lim){ int cnt=1, temp=0; FOR(i, 0, n){ temp += a[i]; ... 阅读全文
摘要:
题意:给定一个整数n(1<n<2^31),求1~n的数与n的最大公约数之和,即∑gcd(i, n) (1<=i <=n) 。分析:枚举n的因数k,求有多少个 i ,使gcd(i,n)=k。设gcd(i,n)=k, 其中 i=ak, n=bk, 则gcd(ak, bk)=k => gcd(a,b)=1, 所以有φ(b)个 i ,使gcd(i,n)=k。答案为:∑k*φ(n/k) (k|n)#define Max 46355LL pri[Max], p, n;LL ans;bool vis[Max] ;void getPrime(LL n){//大范围内素数的线性筛法 阅读全文