重新开始做去年多校联合训练的,准备今年的多校联合训练的,水一水吧
//二维的
#include <cstdio>
#include <cstring>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
int n,x,y;
int a[51],b[51];
int f[51][201];
bool dp(int T)
{
memset(f,-1,sizeof(f));
f[0][0]=0;//边界初始化
for(int i=1;i<=n;i++)
for(int j=0;j<=x;j++)//枚举a[i]的个数
{
if(f[i][x]>=y) return 1;//优化
for(int k=j;k>=0;k--)
{
if(f[i-1][k]==-1) continue;
if(T-(j-k)*a[i]<0) break;
f[i][j]=MAX(f[i][j],f[i-1][k]+(T-(j-k)*a[i])/b[i]);
}
}
return f[n][x]>=y;
}
int main()
{
int T;
int cou=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&x,&y);
int l=0,r=1<<28;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
r=MIN(r,a[i]*x+b[i]*y);
}
int ans=r,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(dp(mid))
{
if(mid<ans) ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("Case %d: %d\n",cou++,ans);
}
return 0;
}
//一维的
#include <cstdio>
#include <cstring>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
int n,x,y;
int a[51],b[51];
int f[201];
bool dp(int T)
{
memset(f,-1,sizeof(f));
f[0]=0;//边界初始化
for(int i=1;i<=n;i++)
for(int j=x;j>=0;j--)//枚举a[i]的个数
{
//if(T>j*a[i]) f[j]+=(T-j*a[i])/b[i];
//不能加上面那句,有错
if(f[x]>=y) return 1;//优化
for(int k=j;k>=0;k--)//枚举K个不是用来弄A[I]的
{
if(f[k]==-1) continue;
if(T-(j-k)*a[i]<0) break;
f[j]=MAX(f[j],f[k]+(T-(j-k)*a[i])/b[i]);
}
}
return f[x]>=y;
}
int main()
{
int T;
int cou=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&x,&y);
int l=0,r=1<<28;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
r=MIN(r,a[i]*x+b[i]*y);
}
int ans=r,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(dp(mid))
{
if(mid<ans) ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("Case %d: %d\n",cou++,ans);
}
return 0;
}