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 + 1
是2
的幂次时,答案才是奇数,也就是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; } };