[思维]牛客编程巅峰赛S1第6场
-----> C思路没错,下标写错了,recheck is necessary
A 简单题
class Solution { public: /** * 位移后二进制串的十进制值 * @param str string字符串 二进制字符串 * @param k int整型 循环位移次数 * @return long长整型 */ long long rotateRight(string str, int k) { // write code here long long ret = 0; for(int i = str.length() - k; i < str.length(); ++i) { ret = ret * 2 + (str[i] - '0'); } for(int i = 0; i < str.length() - k; ++i) { ret = ret * 2 + (str[i] - '0'); } return ret; } };
B 简单思维,用SET收敛非奇即可
class Solution { public: /** * 返回一个数,代表让这些数都变成奇数的最少的操作次数 * @param n int整型 代表一共有多少数 * @param a int整型vector 代表n个数字的值 * @return int整型 */ int solve(int n, vector<int>& a) { // write code here set <int> ST; for(auto x : a) { if(x % 2 == 0) { ST.insert(x); } } int ret = 0; while(!ST.empty()) { auto x = --ST.end(); ++ret; if ( (*x) >> 1 & 1) { ST.erase(x); continue; } else { ST.erase(x); ST.insert((*x) >> 1); } } return ret; } };
C 简单构造,排反序后交叉排列即可
class Solution { public: /** * 返回按照这些花排成一个圆的序列中最小的“丑陋度” * @param n int整型 花的数量 * @param array int整型vector 花的高度数组 * @return int整型 */ int solve(int n, vector<int>& arr) { // write code here sort(arr.rbegin(), arr.rend()); deque<int> dq; for(int i = 0; i < arr.size(); ++i) { if(i & 1) { dq.push_back(arr[i]); } else { dq.push_front(arr[i]); } } int ans = 0; for(int i = 1; i < n; ++i) { ans = max(ans, std::abs(dq[i] - dq[i - 1])); } ans = max(ans, std::abs(dq[0] - dq[n - 1])); return ans; } };