坐等头条题解

大家做完可以来分享题解哦,还能拿卫衣,赢京东卡~~https://www.nowcoder.com/discuss/96308?type=0&order=0&pos=4&page=1#题解#
全部评论
2L 水一帖,应该已经结束了。 并查集#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 9; struct UnionFind { int id[N]; int sz[N]; int cnt; int n; UnionFind(int n) : n(n) { for (int i = 0; i < n; i++) { id[i] = i; sz[i] = 1; } cnt = n; } int find(int x) { if (x == id[x]) { return id[x]; } return id[x] = find(id[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } if (sz[x] > sz[y]) { id[y] = x; sz[x] += sz[y]; } else { id[x] = y; sz[y] += sz[x]; } } int getCnt() { int ans = 0; for (int i = 0; i < n; i++) { if (id[i] == i) { ans++; } } return ans; } }; int main() { int n; scanf("%d", &n); UnionFind* unionFind = new UnionFind(n); for (int i = 0; i < n; i++) { for (;;) { int x; scanf("%d", &x); if (x == 0) { break; } unionFind->unite(i, x-1); } } printf("%d\n", (unionFind->getCnt())); } 不会,骗了 10% 字符串最小表示法#include <bits/stdc++.h> using namespace std; string mini(string s) { string ss(s); ss = ss + ss; bool flag = false; int i = 0, j = 1, k = 0, l = ss.size() / 2, p = 0; while (i < l && j < l) { k = 0; while (ss[i + k] == ss[j + k] && k < l) k++; if (k == l) { p = i; flag = true; break; } if (ss[i + k] > ss[j + k]) if (i + k + 1 > j) i = i + k + 1; else i = j + 1; else if (j + k + 1 > i) j = j + k + 1; else j = i + 1; } if (!flag) if (i < j) p = i; else p = j; return ss.substr(p, l); } const int N = 1e5 + 9; string a[N]; string b[N]; bool solve() { int n; scanf("%d\n", &n); for (int i = 0; i < n; i++) { getline(cin, a[i]); int len = a[i].size(); b[i].clear(); for (int j = len - 1; j >= 0; j--) { char c = a[i][j]; if (c == ' ') c = '*'; b[i].push_back(c); } a[i] = mini(a[i]); b[i] = mini(b[i]); } unordered_set<string> st1; for (int i = 0; i < n; i++) { if (st1.count(a[i])) { return true; } st1.insert(a[i]); } unordered_set<string> st2; for (int i = 0; i < n; i++) { if (st2.count(b[i])) { return true; } st2.insert(b[i]); } for (int i = 0; i < n; i++) { if (st1.count(b[i]) && a[i] != b[i]) { return true; } } return false; } int main() { int t; scanf("%d\n", &t); while (t--) { if (solve()) { puts("Yeah"); } else { puts("Sad"); } } } 不会,用t = 1时候的用最长不降子序列骗了 20 % 根本不会。
点赞 回复
分享
发布于 2018-08-25 12:05
前排等大神
点赞 回复
分享
发布于 2018-08-25 11:57
阅文集团
校招火热招聘中
官网直投
feat:要白金码可以私聊
点赞 回复
分享
发布于 2018-08-25 13:15
开始以为暴力剪枝能水过的,下次不敢了 class Solution { public:     /**      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可      *       * @param arr int整型vector       * @param a int整型       * @param b int整型       * @return int整型      */     int mod=1000000007;     int countTriplets(vector<int>& arr, int a, int b) {         // write code here         int n=arr.size();         long long  ans = 0;         for (int j = 1; j < n - 1; j++) {             long  long num1=0,num2=0;             for (int i = 0; i < j; i++) {                 if(abs(arr[i] - arr[j]) <= a)                     num1++;             }             for (int k = j + 1; k < n; k++) {                 if (abs(arr[k] - arr[j]) <= b)                     num2++;             }             ans += (num1 * num2);             ans %= mod;         }         return ans;     } };
点赞 回复
分享
发布于 2020-12-23 21:06

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务