网易游戏研发第一场
第一题:
第一题 #include <iostream> #include <vector> #include <algorithm> using namespace std; // 统计二进制中1的个数 int NumOf_1_inBinary(long long value) { int counts = 0; while (value) { ++counts; // 如果value不为0,则这个数里至少有一个1 value = (value - 1) & value; } return counts; } int main() { size_t N; // 多少组样例; cin >> N; for (size_t i = 0; i < N; ++i) { size_t n; cin >> n; long long val; vector<long long> aNum; for (size_t i = 0; i < n; ++i) { cin >> val; aNum.push_back(val); } vector<int> counts; for (size_t i = 0; i < aNum.size(); ++i) { long long temp = NumOf_1_inBinary(aNum[i]); counts.push_back(temp); } sort(counts.begin(), counts.end()); counts.erase(unique(counts.begin(), counts.end()), counts.end()); cout << counts.size() << endl; } return 0; }
第四题
思路:存下未被淹的东西的下标,再比较下标的差
#include <iostream> #include <vector> #include <algorithm> #include <stdio.h> using namespace std; long long TheNumOfQun(vector<long long>& nHigh, long nFoold) { vector<long long> nIndex; for (long long i = 0; i < nHigh.size(); ++i) { // 记下未被淹的东西的下标 if (nHigh[i] > nFoold) nIndex.push_back(i); } int nCounts = 0; if (nIndex.size() == 0) { return nCounts; } else { int nCounts = 1; for (long long i = 1; i < nIndex.size(); ++i) { // 比较下标的关系 if (nIndex[i] - nIndex[i - 1] > 1) ++nCounts; } return nCounts; } } int main() { long long N; cin >> N; vector<long long> nHigh = { 6, 12, 20, 14, 15, 15, 7, 19, 18, 13 }; vector<long long> nHigh; long long val; for (long long i = 0; i < N; ++i) { cin >> val; scanf("lld", &val); nHigh.push_back(val); } long long M; cin >> M; vector<long long> nFoold; long long nF; for (long long i = 0; i < M; ++i) { cin >> nF; scanf("lld", &nF); nFoold.push_back(nF); } for (long long i = 0; i < M; ++i) { long a = TheNumOfQun(nHigh, nFoold[i]); cout << a << endl; } return 0; }
第二题(仅作参考,欢迎指正):
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N; cin >> N; // vector<char> ch = { 'N', 'M', 'N', 'N', 'M', 'N', 'B', 'N' }; // vector<char> ch = { 'N', 'N', 'M', 'N', 'B', 'N' }; for (size_t i = 0; i < N; ++i) { vector<char> ch; char a; while (cin >> a) { ch.push_back(a); } int left = 0; int right = 0; vector<int> aNum; if (ch.size() == 1) { if (ch[0] == 'N') { cout << 1 << endl; return 0; } else { cout << 0 << endl; return 0; } } if (ch.size() == 2) { if (ch[0] == 'N' || ch[1] == 'N') { cout << 2; return 0; } } for (size_t i = 0; i < ch.size(); ++i) { if (ch[i] == 'N') { left = i; for (size_t j = i + 1; j < ch.size(); ++j) { if (ch[j] != 'N') { right = j - 1; aNum.push_back(left); aNum.push_back(right); i = j; break; } else if ((ch[j] == 'N' && j == ch.size() - 1)) { aNum.push_back(left); aNum.push_back(j); } } } } if (ch.size() > 1) { if (ch[ch.size() - 2] != 'N' && ch[ch.size() - 1] == 'N') { aNum.push_back(ch.size() - 1); aNum.push_back(ch.size() - 1); } } int res = aNum[1] - aNum[0] + 1; for (size_t i = 2; i < aNum.size(); i += 2) { int gap = aNum[i] - aNum[i - 1]; if (gap <= 3) { // res = max(aNum[i + 1] - aNum[i] + 1 + aNum[i] - aNum[i - 1] - 1 + res, res); res = max(aNum[i + 1] - aNum[i - 1] + aNum[i - 1] - aNum[i - 2] + 1, res); } else { res = max(res, aNum[i + 1] - aNum[i] + 1); } } //for (size_t i = 0; i < aNum.size(); ++i) // cout << aNum[i] << " "; //cout << endl; cout << res << endl; } return 0; }