二分。没什么好说的。就在绝望的时刻,突然AC了。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; long long a[100001],b[100001],c[100001]; long long xam(long long a, long long b){//max if(a>=b) return a; else return b; } long long nim(long long a, long long b){//min if(a>=b) return b; else return a; } int main() { long long n,m; scanf("%lld%lld",&n,&m); for(long long i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]); for(long i=1;i<=m;i++) scanf("%lld",&c[i]); long long l=0,r=100000,mid,ans=2147483648; while(l<r){ mid=(l+r)/2+1; long long gj=0,xq=0; for(int i=1;i<=n;i++) gj+=xam(0,a[i]-b[i]*mid); for(int i=1;i<=m;i++) xq+=c[i]*mid; ans=nim(ans,abs(gj-xq)); if(gj<xq) r=mid-1; else l=mid; } printf("%lld",ans); return 0; }