1 条题解

  • 0
    @ 2025-5-8 11:10:35

    由于桌子的四个脚由四种厚度不同的硬币组成,但最后的高度是相同的,所以该高度肯定是这四种硬币厚度的最小公倍数的n倍。因此只需找出所有组合的最小公倍数,然后进行比较即可

    #include<stdio.h>
    int types[60];
    int tables[15];
    int n,t;
    int maxans[15],minans[15];
    int gcd(int x,int y)//求最大公约数
    {
    	int temp,t;
    	if(y>x)
    	{
           temp=x;
    	   x=y;
    	   y=temp;
    	}
    	while(y!=0)
    	{
    		t=x%y;
    		x=y;
    		y=t;
    	}
    	return x;
    }
    int lcm(int a,int b)//求最小公倍数
    {
    	return (a*b)/gcd(a,b);
    }
    void solve(int lcd1)
    {
    	int i;
    	int temp;
    	int tempmaxans,tempminans;
    	for(i=0;i<t;i++)
    	{
              if(tables[i]%lcd1 == 0)
    		  {
    			  maxans[i]=tables[i];
    			  minans[i]=tables[i];
    		  }
    		  else
    		  {
    			  temp=(int)(tables[i]/lcd1);
    			  tempmaxans=lcd1*temp;
    			  tempminans=lcd1*(temp+1);
                  if(tempmaxans > maxans[i])
    				  maxans[i]=tempmaxans;
    			  if(tempminans < minans[i])
    				  minans[i]=tempminans;
    		  }
    	}
    }
    int main()
    {
    	int i,j,k,l;
    	int lcd,templcd1,templcd2;
    	
    	while(1)
    	{
    		scanf("%d%d",&n,&t);
    		if(n==0 && t==0)
    			break;
    		for(i=0;i<n;i++)
    			scanf("%d",&types[i]);
    		for(i=0;i<t;i++)
    		{
    			scanf("%d",&tables[i]);
                maxans[i]=0;
    			minans[i]=200000000;
    		}
    		for(i=0;i<n-3;i++)//循环求出所有组合的最小公倍数
    		{
    			for(j=i+1;j<n-2;j++)
    			{
    				templcd1=lcm(types[i],types[j]);
    				for(k=j+1;k<n-1;k++)
    				{
    					templcd2=lcm(templcd1,types[k]);
    					for(l=k+1;l<n;l++)
    					{
                             lcd=lcm(templcd2,types[l]);
    						 solve(lcd);//判断当前最小公倍数是否能影响结果
    					}
    				}
    			}
    		}
         for(i=0;i<t;i++)
    		 printf("%d %d\n",maxans[i],minans[i]);
       }
    	return 0;
    }
    
    
    • 1

    信息

    ID
    856
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者