9/26蚂蚁笔试(没a)
t1:二分,但是注意直接算会爆ull,记得改用除法就可以过
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <stack> #include <unordered_map> using namespace std; #define pii pair<int,int> #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(ll i=(a);i<(b);i++) #define PB push_back #define PF push_front #define LB lower_bound #define UB upper_bound #define se second #define fi first typedef vector<ll> VLL; typedef vector<int> VI; #define lowbit(x) ((x)&(-(x))) #define bitcnt(x) (__builtin_popcountll(x)) int main() { ull m; cin >> m; ull n = 2*m-1; ull l = 1; ull r = n; while(l < r) { ull mid = (l+r)>>1; if ((2*m-1+mid)/mid < mid) { r = mid; } else { l = mid+1; } } if ((2*m-1+l)/l < l) { cout << l-1 << endl; } else { cout << l << endl; } return 0; }
t2:还是二分
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <stack> #include <unordered_map> using namespace std; #define pii pair<int,int> #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(ll i=(a);i<(b);i++) #define PB push_back #define PF push_front #define LB lower_bound #define UB upper_bound #define se second #define fi first typedef vector<ll> VLL; typedef vector<int> VI; #define lowbit(x) ((x)&(-(x))) #define bitcnt(x) (__builtin_popcountll(x)) int main() { ll n; ll k; cin >> n >> k; string s; cin >> s; unordered_map<char, int> map; rep(i, 0, n) { map[s[i]-'a']++; } if (map.size() > k) { cout << -1 << endl; return 0; } int r = n; int l = 1; while(l < r) { int mid = (l+r)>>1; int sum = 0; for (auto&& it : map) { sum += (it.second+mid-1)/mid; } if (sum > k) { l = mid+1; } else { r = mid; } } cout << l << endl; return 0; }
t3:写了快一个小时没a掉,我的思路是找出所有叶子结点,计算所有叶子结点间的距离,然后从所有叶子结点中选出2个距离最大的,分别标记一个颜色,然后再从剩下的叶子结点里选两个距离最大的,设置合适的颜色,重复这个步骤直到所有叶子结点都被标记。然后从所有叶子结点多头bfs,没有被染色的结点就被染色成bfs过来的上一个结点的颜色,只过了26+%
其实写完第一版代码就只剩10分钟了,第一次交过了20%,后来修了点bug多过了点,但是代码其实还没写完。不知道这种方法OK不OK,有没有大佬a了的看看解法,附题目
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <utility> #include <vector> #include <cmath> #include <stack> #include <queue> #include <unordered_map> using namespace std; #define pii pair<int,int> #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(ll i=(a);i<(b);i++) #define PB push_back #define PF push_front #define LB lower_bound #define UB upper_bound #define se second #define fi first typedef vector<ll> VLL; typedef vector<int> VI; #define lowbit(x) ((x)&(-(x))) #define bitcnt(x) (__builtin_popcountll(x)) void bfs(unordered_map<int, vector<int>> edge_map, int cur, vector<bool>& visited, vector<vector<int>>& distance, vector<int> leaves) { visited[cur] = true; if (edge_map[cur].size() == 1) return; rep(i, 0, edge_map[cur].size()) { int target = edge_map[cur][i]; if (visited[target]) continue; bfs(edge_map, target, visited, distance, leaves); rep(j, 0, leaves.size()) { distance[cur][leaves[j]] = min(distance[cur][leaves[j]], 1+distance[target][leaves[j]]); } } return; } int main() { ll n; cin >> n; unordered_map<int, vector<int>> edge_map; vector<int> leaves; vector<vector<int>> distance(n+1, vector<int>(n+1)); vector<bool> color(n+1); rep(i, 0, n-1) { int from, to; cin >> from >> to; edge_map[from].push_back(to); edge_map[to].push_back(from); } for (auto&& it : edge_map) { if (it.second.size() == 1) { leaves.push_back(it.first); } } for (int i = 0; i < leaves.size(); i++) { for (int j = 0; j < leaves.size(); j++) { if (i != j) distance[leaves[i]][leaves[j]] = n; } } vector<bool> visited(n+1); bfs(edge_map, 1, visited, distance, leaves); // 最大的直径一定在两个叶子结点间产生 // 这两个一定要染成不同颜色 // 计算所有叶子结点之间的距离 // 确定所有叶子结点的颜色后,从每个叶子结点开始染色 unordered_map<int, bool> colored; int left = n; queue<int> q; while(left > n-leaves.size()) { pair<int, int> big_pair = make_pair(0, 0); for (int i = 0; i < leaves.size(); i++) { for (int j = i+1; j < leaves.size(); j++) { if (distance[leaves[j]][leaves[i]] > distance[big_pair.fi][big_pair.se] && !(colored[leaves[i]] && colored[leaves[j]])) big_pair = make_pair(leaves[i], leaves[j]); } } if (colored[big_pair.fi]) { color[big_pair.se] = ~color[big_pair.fi]; q.push(big_pair.se); colored[big_pair.fi] = true; left--; } else if (colored[big_pair.se]) { color[big_pair.fi] = ~color[big_pair.se]; colored[big_pair.se] = true; left--; q.push(big_pair.fi); } else { color[big_pair.fi] = true; // true: R, false: B colored[big_pair.fi] = true; left--; colored[big_pair.se] = true; left--; q.push(big_pair.fi); q.push(big_pair.se); } } while(q.size() > 0) { int cur = q.front(); q.pop(); for (auto next : edge_map[cur]) { if (colored[next]) continue; colored[next] = true; color[next] = color[cur]; q.push(next); } } for (int i = 1; i <= n; i++) { cout << (color[i]?"B":"R"); } cout << endl; return 0; }#蚂蚁笔试##蚂蚁#