1242 网线主管 最短:0.01,最长:输入的max 判定条件:按照mid截取网线总数量>=k #include <bits/stdc++.h> using namespace std; int n,k; int a[10050]; double b; bool f(int mid){ long long cnt=0; for(int i=1;i<=n;i++){ cnt+=a[i]/mid; if(cnt>=k) return true; } return cnt>=k; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>b; a[i]=round(b*100); } if(!f(1)) { cout<<"0.00";return 0; } int l=1,r=10000000; while(l<r){ int mid=(l+r+1)/2; if(f(mid)) l=mid; else r=mid-1; } cout<<fixed<<setprecision(2)<<1.0*l/100; return 0; } 1240 查找最接近的数 #include <bits/stdc++.h> using namespace std; int n,m,k,a[100050]; bool f(int mid){ return a[mid]<=k; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]==a[i-1]&&i!=1){ i--;n--; } } cin>>m; while(m--){ cin>>k; if(k<=a[1]) cout<<a[1]<<endl; else if(k>=a[n]) cout<<a[n]<<endl; else { int l=1,r=n; while(l<r){ int mid=(l+r+1)/2; if(f(mid)) l=mid; else r=mid-1; } if(k-a[l]<=a[l+1]-k) cout<<a[l]<<endl; else cout<<a[l+1]<<endl; } } return 0; } 时空复杂度 |