记录编号 |
196939 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
栅栏的木料 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.020 s |
提交时间 |
2015-10-22 21:40:09 |
内存使用 |
0.33 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int SIZEN=60,SIZER=1040;
int N,R,board[SIZEN],rail[SIZER],sb=0,sr=0;
int pos[SIZER]={0},pre[SIZER]={0};
void read()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d",&board[i]);
sb+=board[i];
}
scanf("%d",&R);
for(int i=1;i<=R;i++)scanf("%d",&rail[i]);
}
bool dfs(int now,int sum)
{
if(now<1) return 1;
if(sum>sb-sr) return 0;
bool ok=0;
int st=1;
if(rail[now]==rail[now+1]) st=pos[now+1];
for(int i=st;i<=N;i++)
{
if(board[i]>=rail[now])
{
board[i]-=rail[now];
int tem=sum;
pos[now]=i;
if(board[i]<rail[1]) tem=sum+board[i];
if(dfs(now-1,tem)) ok=1;
board[i]+=rail[now];
pos[now]=0;
if(ok==1) return 1;
}
}
return 0;
}
bool check(int x)
{
sr=pre[x];
if(dfs(x,0)) return 1;
else return 0;
}
bool cmp(int a,int b)
{
return a>b;
}
void work()
{
int l=0,r=R;
sort(rail+1,rail+R+1);
sort(board+1,board+1+N);
for(int i=1;i<=R;i++) pre[i]=pre[i-1]+rail[i];
while(l<r)
{
int mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid;
//cout<<mid<<endl;
}
if(!check(r)) r--;
printf("%d",r);
}
int main()
{
freopen("fence8.in","r",stdin);
freopen("fence8.out","w",stdout);
read();
work();
return 0;
}