换抵挡装置

给出两个长度为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);
	
}
posted @ 2021-01-29 12:35  empty_thought  阅读(82)  评论(0)    收藏  举报