二分。没什么好说的。就在绝望的时刻,突然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;
}