题目:Multicolored Markers
题意:现有一面长宽可无线延伸的网格,现要求将 a a 个格子染成红色, 个格子染成蓝色。要求染成的图形为矩形,且至少有一种颜色染成了矩形。求染成的图形的最小周长。
思路:
枚举染成的大矩形的边长,同时维护内部可以框住的小矩形的某一边的最大边长,判断一下能否围住就可以了。
当时以为只需要考虑占地多的染料围住占地少的染料,结果WA了。其实占地少的围住占地多的也是可以的。
数据:
Input
11 24
Output
24
代码:
#include<bits/stdc++.h>
using namespace std;#define ll long long
#define inf (1<<30)
#define maxn ((int)(1e14))ll n,m;int main() {scanf("%I64d%I64d",&n,&m);if(m<n) swap(n,m);ll x,y;ll sqr2=sqrt(n+m);ll sqr=sqrt(n);ll ans=inf;for(ll i=1;i<=sqr2;i++) {if(n%i==0&&i<=sqr) x=i,y=n/i;if((n+m)%i) continue;if(i<x||(n+m)/i<y) continue;ans=min(ans,2*(i+(n+m)/i));}sqr=sqrt(m);for(ll i=1;i<=sqr2;i++) {if(m%i==0&&i<=sqr) x=i,y=m/i;if((n+m)%i) continue;if(i<x||(n+m)/i<y) continue;ans=min(ans,2*(i+(n+m)/i));}if(ans) printf("%I64d",ans);else printf("%I64d",n+m);return 0;
}