[CF712C]Memory and De-Evolution(暴力,逆解)

题目链接: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 }
原文地址:https://www.cnblogs.com/kirai/p/5861203.html