标签:细节 empty air bsp begin bin get == 构造
比赛地址:这里
T1:
根据题意,符合题目要求的只有两种字符串:0101010…或1010101…,因此,我们可以直接构造这两种字符串并比较与原串的差异即可。
附上代码:
class Solution { public: int minOperations(string s) { int len = s.size(); string s2 = s; for(int i = 0;i < len;i++) { if(i % 2 == 1) s2[i] = ‘1‘; if(i % 2 == 0) s2[i] = ‘0‘; } int minsum1 = 0, minsum2 = 0; for(int i = 0;i <len;i++) if(s[i] != s2[i]) minsum1++; for(int i = 0;i < len;i++) { if(i % 2 == 1) s2[i] = ‘0‘; if(i % 2 == 0) s2[i] = ‘1‘; } for(int i = 0;i < len;i++) if(s[i] != s2[i]) minsum2++; if(minsum1 > minsum2) return minsum2; return minsum1; } };
T2:
对于T2,我们可以考虑用数学方法处理。即统计每一个连续的相同的子串长度,并用求和公式求出值。
代码:
class Solution { public: long long countHomogenous(string s) { long long mod = 1e9 + 7; long long ans = 0, i = 0; int len = s.size(); while(i < len) { int begin = i; int end = begin; while(end < len && s[end] == s[begin]) end++; i = end; end--; long long num = end - begin + 1; long long t = (1 + num) * num / 2; ans += t; } return (ans % mod); } };
T3:
由于T3数据较为庞大,我们考虑用二分法进行求解。
代码如下:
class Solution { public: int minimumSize(vector<int>& nums, int maxOperations) { int a[100005]; vector < int > :: iterator it; int n = 0; for(it = nums.begin();it != nums.end();it++) { n++; a[n] = *it; } sort(a + 1, a + n + 1); int lft = 1, rgh = a[n], ans; while(lft <= rgh) { int mid = (lft + rgh) / 2; int sum = 0; for(int i = 1;i <= n;i++) { int t = ceil(a[i] * 1.0 / mid); sum += t - 1; } if(sum <= maxOperations) { ans = mid; rgh = mid - 1; } else lft = mid + 1; } return ans; } };
T4:
本题实际上是一道较为简单的暴力题(至少我觉得是这样的)。我们可以将符合条件的三元组保存起来,通过桶排求出每个点的度数,然后就可以求出这个三元组的度数。值得一提的是,这道题最难的地方在于STL的操作与运用,处理读入数据和输出数据花费了我不少时间。
代码如下:
class Solution { public: int minTrioDegree(int n, vector<vector<int>>& edges) { bool G[405][405]; int bin[405]; memset(bin, 0, sizeof(bin)); memset(G, false, sizeof(G)); vector < vector < int > > :: iterator it1; vector < int > :: iterator it2; vector < pair < int, pair < int, int > > > Trio; pair < int, int > ts; for(it1 = edges.begin();it1 != edges.end();it1++) { vector < int > t = *it1; int countn = 0, u, v; for(it2 = t.begin();it2 != t.end();it2++) { countn++; if(countn == 1) u = *it2; if(countn == 2) v = *it2; } G[u][v] = G[v][u] = true; bin[u]++; bin[v]++; } for(int x = 1;x <= n;x++) for(int y = x + 1;y <= n;y++) for(int z = y + 1;z <= n;z++) if(G[x][y] && G[y][z] && G[x][z]) Trio.push_back(make_pair(x, make_pair(y, z))); if(Trio.empty()) return -1; vector < pair < int, pair < int, int > > > :: iterator it; int ans = INT_MAX; for(it = Trio.begin();it != Trio.end();it++) { ts = it->second; int tsum = bin[it->first] + bin[ts.first] + bin[ts.second] - 6; ans = min(ans, tsum); } return ans; } };
总结:
其实本场比赛并不难,但较为注重细节。由于我的粗心大意,我T4竟然没有来得及做完,比赛就停止了!一定得好好吸取教训!
标签:细节 empty air bsp begin bin get == 构造
原文地址:https://www.cnblogs.com/fy4815/p/14401878.html