1 条题解
-
0
由于桌子的四个脚由四种厚度不同的硬币组成,但最后的高度是相同的,所以该高度肯定是这四种硬币厚度的最小公倍数的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
- 上传者