codeforces#154_div2_B (253B) Physics Practical
题目地址:戳这里
思路:先排序
然后对每一个当前的p[i],用logn的方法 对每一个找到2*p[i] 的 upper_bound
用贪心的思想知道,肯定是去头去尾,不会去中间的。
算法复杂度: nlogn
注意一定是文件输入输出
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<fstream> using namespace std; int p[1000005]; int main() { // ifstream cin("input.txt"); ofstream cout("output.txt"); int n; cin>>n; // // for(int i=0;i<n;i++) // scanf("%d",&p[i]); for(int i=0;i<n;i++) cin>>p[i]; sort(p,p+n); int maxi=-1; for(int i=0;i<n;i++) { // if(2*p[i]>p[n-1]) break; int l=0,r=n; int m; while(l<r) { m=l+(r-l)/2; if(2*p[i]>=p[m]) l=m+1; else r=m; } if(l-i>maxi) maxi=l-i; } cout<<n-maxi<<endl; return 0; }
直接用stl 更快捷
#include<iostream> #include<algorithm> #include<cstdio> #include<fstream> using namespace std; int p[1000005]; int main() { ifstream cin("input.txt"); ofstream cout("output.txt"); int n; cin>>n; for(int i=0;i<n;i++) cin>>p[i]; sort(p,p+n); int maxi=-1; for(int i=0;i<n;i++) if(upper_bound(p,p+n,2*p[i])-(p+i)>maxi) { maxi=upper_bound(p,p+n,2*p[i])-(p+i); } cout<<n-maxi<<endl; }
posted on 2014-03-26 01:31 814jingqi的ACM 阅读(191) 评论(0) 编辑 收藏 举报