题目描述:
有些贪心吧,就是把矩阵分成两类处理
一类是无论用1*2 还是1*3 都能拼成的
另一类是还有2*2矩阵不能算入的的。
枚举1*3的用多少,剩下的都用1*2的来补。
取max 就是最优结果
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<algorithm> #include<cstring> using namespace std; int t,n,m,n1,n2; int a[10009],b[10009]; int ans,tot; bool cmp(const int & x,const int &y) { return x>y;} int main() { freopen("eyesight.in","r",stdin); freopen("eyesight.out","w",stdout); scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&m,&n1,&n2); for(int i=1;i<=n1;i++) scanf("%d",&a[i]); for(int i=1;i<=n2;i++) scanf("%d",&b[i]); sort(a+1,a+1+n1,cmp);sort(b+1,b+n2+1,cmp); for(int i=1;i<=n1;i++) a[i]+=a[i-1]; for(int i=1;i<=n2;i++) b[i]+=b[i-1]; ans=0; int all,yu; yu=(n*m)%3; if(n%3==2&&m%3==2&&(n==2||m==2)) yu=4; all=min(n2,(n*m-yu)/3); for(int i=0;i<=all;i++) ans=max(ans,b[i]+a[min((m*n-i*3)/2,n1)]); printf("%d\n",ans); } return 0; }