1. 程式人生 > >【非原創】codeforces 1029F Multicolored Markers 【貪心+構造】

【非原創】codeforces 1029F Multicolored Markers 【貪心+構造】

scanf 分享 ret ++ sed 遍歷 pen https int

題目:戳這裏

題意:給a個紅色小方塊和b個藍色小方塊,求其能組成的周長最小的矩形,要求紅色或藍色方塊至少有一個也是矩形。

思路來源:戳這裏

解題思路:遍歷大矩形可能滿足的所有周長,維護最小值即可。不易想到的是求合理周長的方法。判斷方法是能否放進去一個藍色矩形或者紅色矩形,只要能放進去一個就滿足條件了。具體看代碼。

技術分享圖片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <string>
 5 #include <vector>
 6
#include <map> 7 #include <cmath> 8 #include <iostream> 9 using namespace std; 10 typedef long long ll; 11 const int maxn = 1e6 + 10; 12 int n; 13 int na[maxn]; 14 int main() 15 { 16 ll a, b; 17 scanf("%lld %lld", &a, &b); 18 ll sum = a + b; 19 ll ans = 2 * (a + b + 1
); 20 ll minn = a + b; 21 for(ll i = 1; i * i <= sum; ++i) 22 { 23 if(a % i == 0) minn = min(minn, a / i); 24 if(b % i == 0) minn = min(minn, b / i);//minn就是用來找到那個能放進去的小矩形 25 if((a + b) % i == 0 && minn <= (a + b) / i) ans = min(ans, 2 * ((a + b) / i + i));//維護合理的大矩形周長
26 } 27 printf("%lld\n", ans); 28 return 0; 29 }
View Code

【非原創】codeforces 1029F Multicolored Markers 【貪心+構造】