Codeforces 484B Maximum Value(排序+二分)
2015-06-04 19:10
661 查看
题目链接:
http://codeforces.com/problemset/problem/484/B
题意:
求a[i]%a[j] (a[i]>a[j])的余数的最大值
分析:
要求余数的最大值非常明显a[i]越接近a[j]的倍数则余数越大 ,因此我们将全部的元素从大到小排序 ;
然后枚举a[j]的倍数 ,二分查找小于a[i]倍数的最大值,然后更新余数的最大值。
代码例如以下:
http://codeforces.com/problemset/problem/484/B
题意:
求a[i]%a[j] (a[i]>a[j])的余数的最大值
分析:
要求余数的最大值非常明显a[i]越接近a[j]的倍数则余数越大 ,因此我们将全部的元素从大到小排序 ;
然后枚举a[j]的倍数 ,二分查找小于a[i]倍数的最大值,然后更新余数的最大值。
代码例如以下:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[200010]; inline int mymax(int a,int b){ return a > b? a: b; } inline int bin_search(int l,int r,int val)//二分查找小于val的最大值 { int mid; while(l<=r){ mid=(l+r)>>1; if(a[mid]==val) return mid-1; else if(a[mid]>val) r=mid-1; else l=mid+1; } return r; } int main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int mmax = 0; for(int i=0;i<n-1;i++){ if(a[i]==0||a[i]!=a[i-1]){//剪枝。假设之前出现过了就不用查了; int tmp=a[i]+a[i]; while(tmp<=a[n-1]){ int pos=bin_search(0,n-1,tmp); mmax = mymax(mmax,a[pos]%a[i]); tmp+=a[i]; } mmax =mymax(mmax,a[n-1]%a[i]); } } printf("%d\n",mmax); } return 0; }
相关文章推荐
- [D3] 11. Basic D3 chart interactivity on(), select(this), classed(class, trueorfalse)
- Druid是什么
- Druid使用ConfigFilter
- 开发中使用到UITableView的各个技术点
- 如何在storyBoard中实现UIimageView长宽相等
- Java序列化中的serialVersionUID有什么用?
- iOS valueForKeyPath使用与感悟
- UITableView使用详解
- Reveal:分析iOS UI的利器
- UITableView_1简单使用
- MUI - 解决动态列表页图片懒加载再次加载不成功的bug
- UITableView优化
- poj 3384 Feng Shui(半平面交的联机算法)
- query_posts()的参数使用方法
- UIDevice的简易说明
- 让query_posts() 或 wp_query()同时使用多个 meta_key与 meta_value 来查询多个自定义字段与值
- QuickSort(经典快排算法)
- poj 3061 Subsequence
- Android酷炫实用的开源框架(UI框架)
- miniUI Tabs 懒加载