题目:
给出M个电梯,能上升U层,下降D层。总共N此操作。
思路:
对于每个电梯,二分上升(或下降)的次数,取min。
也可以用数学方法
#include<iostream > #include<cstdio> #include<queue> #include<algorithm> #include<math.h> #include<cstring> using namespace std; int n,m; long long minn=9999999999; int u,d; bool check(int x) { if((1LL*x*u-1LL*(n-x)*d)<0) return 1; else return 0; } int main() { freopen("building.in","r",stdin); freopen("building.out","w",stdout); scanf("%d%d",&n,&m);//n次m个 while(m--) { scanf("%d%d",&u,&d); int l=0,r=n,mid; while(l < r) { mid=(l+r)>>1; if(check(mid)) l=mid+1; else r=mid; } minn=min(minn,1LL*r*u-1LL*(n-r)*d); } cout<<minn; return 0; }
#include<iostream> #include<cstdio> #include<queue> #include<math.h> #include<cstring> #define LL long long using namespace std; int n,m; LL a,b; int main() { freopen("building.in","r",stdin); freopen("building.ans","w",stdout); scanf("%d%d",&n,&m); LL x,y,ans=953364132; while(m--) { scanf("%lld%lld",&a,&b); x=(n*a)%(a+b); ans=min(ans,x); } cout<<ans; return 0; }