题目链接:http://codeforces.com/contest/712/problem/C
题意:给你一个变长为x的正三角形,问通过几步可以变成变长为y的正三角形,每一步都要维持三角形的形态。
看样例的话会发现从x到y变换的时候超麻烦,于是我倒着看了一眼样例…发现每一次更新的都是最小的那条边,除了第一个样例为了凑那个22,其实也无所谓了。因为凑出第一个大于x的边以后,步骤+2其实就是所求的答案了。
所以每次找最大的两条边,两条边边长和-1给第三条边,一直加到三条边都是x为止。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 using namespace std; 20 #define fr first 21 #define sc second 22 #define cl clear 23 #define BUG puts("here!!!") 24 #define W(a) while(a--) 25 #define pb(a) push_back(a) 26 #define Rint(a) scanf("%d", &a) 27 #define Rs(a) scanf("%s", a) 28 #define Cin(a) cin >> a 29 #define FRead() freopen("in", "r", stdin) 30 #define FWrite() freopen("out", "w", stdout) 31 #define Rep(i, len) for(int i = 0; i < (len); i++) 32 #define For(i, a, len) for(int i = (a); i < (len); i++) 33 #define Cls(a) memset((a), 0, sizeof(a)) 34 #define Clr(a, x) memset((a), (x), sizeof(a)) 35 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 36 #define lrt rt << 1 37 #define rrt rt << 1 | 1 38 #define pi 3.14159265359 39 #define RT return 40 #define lowbit(x) x & (-x) 41 #define onecnt(x) __builtin_popcount(x) 42 typedef long long LL; 43 typedef long double LD; 44 typedef unsigned long long ULL; 45 typedef pair<int, int> pii; 46 typedef pair<string, int> psi; 47 typedef pair<LL, LL> pll; 48 typedef map<string, int> msi; 49 typedef vector<int> vi; 50 typedef vector<LL> vl; 51 typedef vector<vl> vvl; 52 typedef vector<bool> vb; 53 54 int x, y; 55 int a[5]; 56 57 int main() { 58 // FRead(); 59 while(~Rint(x)&&~Rint(y)) { 60 if(y*2>x) { 61 puts("3"); 62 continue; 63 } 64 if(y*2==x) { 65 puts("4"); 66 continue; 67 } 68 Rep(i, 3) a[i] = y; 69 int ret = 0; 70 while(1) { 71 sort(a, a+3); 72 bool flag = 0; 73 Rep(i, 3) { 74 if(a[i] != x) flag = 1; 75 } 76 if(!flag) break; 77 int tmp = a[1] + a[2] - 1; 78 if(tmp > x) tmp = x; 79 a[0] = tmp; 80 ret++; 81 } 82 printf("%d ", ret); 83 } 84 RT 0; 85 }