题意:星球大战 ,地球人有n个星球,外星人有m个星球,每一个星球都初始的飞机数,和生产飞机的能力。问地球人要多长时间才能打败外星人。。
1,一个地球人的星球只能打一个外星人的星球,一个外星人的星球只能被一个地球人的星球攻击,因此可以用二分图匹配。(开始时没有看清这句,以为是线性规划的问题,老感觉不对劲,看了别人用二分图匹配之后,,,,)
2,二分时间。时间的最大值,我也不会算,() 用INF=0x3f3f3f3f;能过就是了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 259;
const int INF = 0x3f3f3f3f;
int hst[N],hsp[N],ast[N],asp[N];
int dis[N][N];
int n,m;
void init()
{
for(int i=0;i<n;i++)
scanf("%d%d",&hst[i],&hsp[i]);
for(int i=0;i<m;i++)
scanf("%d%d",&ast[i],&asp[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&dis[i][j]);
}
bool map[N][N];
int Lin[N];
int visit[N];
bool fin(int x)
{
for(int i=0;i<m;i++)
if(map[x][i]&&(!visit[i]))
{
visit[i] = true;
if(Lin[i]==-1||fin(Lin[i]))
{
Lin[i] = x;
return true;
}
}
return false;
}
bool ok(int t)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(1ll+hst[i]+1ll*(t-dis[i][j])*hsp[i]>=1ll+ast[j]+1ll*t*asp[j])
map[i][j] = true;
else
map[i][j] = false;
int ans = 0;
memset(Lin,-1,sizeof(Lin));
for(int i=0;i<n;i++)
{
memset(visit,false,sizeof(visit));
if(fin(i))
ans++;
}
if(ans==m) return true;
return false;
}
int oor(int l,int r)
{
if(l==r) return l;
int mid = (l+r)>>1;
if(ok(mid))
return oor(l,mid);
else
return oor(mid+1,r);
}
void solve()
{
if(!ok(INF))
{
printf("IMPOSSIBLE\n");
return ;
}
printf("%d\n",oor(0,INF));
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&(n+m))
{
init();
solve();
}
return 0;
}