又是毕业季I
洛谷P1372 又是毕业季I
对于答案a,k*a是最接近n的,即a=n/k(下取整),所以直接输n/k即可。
我的方法是
二分查找
n/k真的没有想到唉。
我找的最大公约数,如果当前的mid对应的个数比k大,就往大了找,否则往小里找,对于边界问题,要加一些特判。
#include<bits/stdc++.h> using namespace std; int n,k; bool p(int x) { int i; for(i=0;i<=n&&i*x<=n;i++){ } if(i-1>=k) return true; return false; } int main() { cin>>n>>k; if(n==k) { cout<<1; return 0; } int l=1,r=n,mid; while(l<r) { mid=(l+r)>>1; if(p(mid)) l=mid+1; else r=mid; } if(k==1) cout<<n; else cout<<max(l-1,1); return 0; }