换抵挡装置
给出两个长度为x,y且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,求出能容纳它们最短容器长度。
每列高度只有1或2的意思是每个长条由1或2的单位小长条横向排列而成,如果两个长条上下扣的时候可以1,2全部或部分互补,总长就比较短,如果没有,只能分开放。
总体思路是采取将一个较短的长条倒置,从左向右平移,循环判断每个单位的长度之和是否超过3,并不断更新平移的位置,记录最短的和长度,其实并不复杂。
include <stdio.h>
#include <stdlib.h>
int main()
{
int len1,len2;//len1<len2
scanf("%d %d",&len1,&len2);
int*cag1=(int*) calloc(len1+len2,sizeof(int));
int*cag2=(int*) calloc(len1+len2,sizeof(int));
for(int i=0;i<len2;i++) cag1[i]=0;
for(int i=len2;i<len1+len2;i++) scanf("%d",cag1+i);
for(int i=0;i<len2;i++) scanf("%d",cag2+i);
for(int i=len2;i<len1+len2;i++) cag2[i]=0;
int location=0;
int head=0;
for(head;head<len1;head++)
{
int flag=1;
for(int j=0;j<head;j++)
{
if(cag1[len1+len2-j-1]+cag2[head-j-1]>3)
{
flag=0;
break;
}
}
if(flag) location=head;
}
head=len1;
for(head;head<len2;head++)
{
int flag=1;
for(int j=0;j<len1;j++)
{
if(cag1[len1+len2-j-1]+cag2[head-j-1]>3)
{
flag=0;
break;
}
}
if(flag)
{
location=len1;
printf("%d",len2);
return 0;
}
}
head=len2;
for(head;head<len1+len2;head++)
{
int flag=1;
for(int j=0;j<len1+len2-head;j++)
{
if(cag1[len2+j]+cag2[head-len1+j]>3)
{
flag=0;
break;
}
}
if(flag)
if(len1+len2-head>location)
{
location=len1+len2-head;
printf("%d",len1+len2-location);
return 0;
}
}
printf("%d",len1+len2-location);
}

浙公网安备 33010602011771号