A题:
排好序后,最大值肯定是连续的3个数,这个没得说。
最小值的话,一定有两条边是连续的,二分第三条边即可。而且是最长的两条边一定是连续的。

//数据:5,[1,5,6,12,12] 答案是5
//5, [2, 40, 70, 100, 101] 答案是68
#define all(x) (x).begin(), (x).end()
typedef long long LL;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回在所有合法的三角形的组成中,最大的三角形的周长减去最小的三角形的周长的值
     * @param n int整型 代表题目中的n
     * @param a int整型vector 代表n个数的大小
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        sort(all(a));
        LL Mx = 0, Mn = 1e18;
        for(int i = 2; i < n; ++i) {
            if(a[i - 1] + a[i - 2] > a[i]) {
                Mx = max(Mx, (LL)a[i] + a[i - 1] + a[i - 2]);
            }
        }
        for(int i = 1; i + 1 < n; ++i) {
            int p = upper_bound(a.begin(), a.begin() + i, a[i + 1] - a[i]) - a.begin();
            if(p < i) {
                Mn = min(Mn, (LL)a[p] + a[i] + a[i + 1]);
            }
        }
        return (int)(Mx - Mn);
    }
};

B题
打表发现,只有当n + 12的幂次时,答案才是奇数,也就是true

有一点卡常,不要直接把string当参数传自己写的函数离去,容易因为动态开辟内存而tle。

#define fi first
#define se second
#define mk make_pair
#define o2(x) (x) * (x)
#define eb emplace_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define clr(a, b) memset((a), (b), sizeof((a)))
#define GKD std::ios::sync_with_stdio(false);cin.tie(0)
#define rep(i, s, t) for(int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(int i = (s), LIM=(t); i >= LIM; --i)
#define my_unique(x) sort(all(x)), x.erase(unique(all(x)), x.end())
typedef long long LL;
typedef long long int64;
typedef unsigned long long uint64;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;// 998244353
const int MXN = 1e5 + 5;
int ksm(int a, int64 b, int kmod = mod) {int res = 1;for(;b > 0;b >>= 1, a = (int64)a * a % kmod) if(b &1) res = (int64)res * a % kmod;return res;}

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n string字符串 三角形的长和高
     * @return bool布尔型
     */
    string mul(string n) {
        reverse(n.begin(), n.end());
        int len = n.length();
        for(int i = 0; i < len; ++i) n[i] = (n[i] - '0') * 2 + '0';
        for(int i = 0; i < len; ++i) {
            if(n[i] > '9') {
                if(i == len - 1) ++ len, n += '0';
                n[i + 1] += (n[i] - '0') / 10;
                n[i] = (n[i] - '0') % 10 + '0';
            }
        }
        reverse(n.begin(), n.end());
        return n;
    }
    void chu(string &n, int &len) {
        for(int i = len - 1; i >= 0; --i) {
            int x = n[i] - '0';
            if(x % 2 == 0) n[i] = x / 2 + '0';
            else {
                n[i] = x / 2 + '0';
                n[i - 1] += 10;
            }
        }
        while(n[len - 1] == '0') -- len;
    }
    string add1(string n) {
        reverse(n.begin(), n.end());
        int len = n.length();
        n[0] ++;
        for(int i = 0; i < len; ++i) {
            if(n[i] > '9') {
                if(i == len - 1) ++ len, n += '0';
                n[i + 1] += (n[i] - '0') / 10;
                n[i] = (n[i] - '0') % 10 + '0';
            }
        }
        reverse(n.begin(), n.end());
        return n;
    }

    bool judge(string n) {
        // write code here
        bool flag = 0;
        n = add1(n); 
        reverse(all(n));
        int len = n.length();
        while(1) {
            if(len == 1 && n[0] == '1') {
                flag = 1;
                break;
            }
            if((n[0] - '0') % 2 == 1) break;
            chu(n, len);
        }
        // string x = "2";
        // for(int i = 1; i <= 4000; ++i) {
        //     if(x == n) {
        //         flag = 1;
        //         break;
        //     }
        //     x = mul(x);
        // }
        return flag;
    }
};

C题
n只有5000,找出环,然后枚举删掉哪一条边即可。

#define fi first
#define se second
#define mk make_pair
#define o2(x) (x) * (x)
#define eb emplace_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define clr(a, b) memset((a), (b), sizeof((a)))
#define GKD std::ios::sync_with_stdio(false);cin.tie(0)
#define rep(i, s, t) for(int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(int i = (s), LIM=(t); i >= LIM; --i)
#define my_unique(x) sort(all(x)), x.erase(unique(all(x)), x.end())
typedef long long LL;
typedef long long int64;
typedef unsigned long long uint64;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;// 998244353
const int MXN = 5e3 + 5;
int ksm(int a, int64 b, int kmod = mod) {int res = 1;for(;b > 0;b >>= 1, a = (int64)a * a % kmod) if(b &1) res = (int64)res * a % kmod;return res;}

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n int整型 
     * @param u int整型vector 
     * @param v int整型vector 
     * @return int整型
     */
    map<pair<int,int>, int> vis;
    vector<int> vs, mp[MXN];
    int fa[MXN], dis[MXN], ip[MXN];
    void dfs(int u, int ba) {
        ip[u] = 1;
        fa[u] = ba;
        for(int v: mp[u]) {
            if(v == ba) continue;
            if(ip[v]) {
                vs.eb(v);
                int x = u;
                while(x != v) {
                    vs.eb(x);
                    x = fa[x];
                }
                return ;
            }
            dfs(v, u);
            if(vs.size()) return;
        }
    }
    void dfs2(int u, int ba) {
        dis[u] = dis[ba] + 1;
        for(int v: mp[u]) {
            if(v == ba) continue;
            if(vis[mk(u, v)]) continue;
            dfs2(v, u);
        }
    }
    int solve(int n) {
        dfs2(1, 0);
        int pa = 1;
        for(int i = 2; i <= n; ++i) if(dis[i] > dis[pa]) pa = i;
        dfs2(pa, 0);
        for(int i = 2; i <= n; ++i) if(dis[i] > dis[pa]) pa = i;
        return dis[pa];
    }
    int MaxDiameter(int n, vector<int>& u, vector<int>& v) {
        // write code here
        int Ans = 0;
        rep(i, 0, n + 1) ip[i] = 0, mp[i].clear();
        rep(i, 0, n) {
            mp[u[i]].eb(v[i]);
            mp[v[i]].eb(u[i]);
        }
        int flag = 0;
        rep(i, 1, n + 1) {
            int x = mp[i].size();
            my_unique(mp[i]);
            if(mp[i].size() != x) flag = 1;
        }
        if(flag) return solve(n) - 1;
        dfs(1, 0);
        int len = vs.size();
        for(int i = 1; i < len; ++i) {
            vis[mk(vs[i-1], vs[i])] = 1;
            vis[mk(vs[i], vs[i-1])] = 1;
            Ans = max(Ans, solve(n));
            vis.clear();
        }
        return Ans - 1;
    }
};