按照卡中心校园招聘的要求,HR小招和小商需要从三个科室中(分别为A、B、C)抽派面试官去往不同城市。
两名HR按照以下规定轮流从任一科室选择面试官:每次至少选择一位,至多选择该科室剩余面试官数。最先选不到面试官的HR需要自己出差。
假设HR小招和小商都不想出差且每次选择都采取最优策略,如果是小招先选,写一个函数来判断她是否需要出差。如果不需要出差,请给出第一步的最优策略。
输入为三个正整数,分别代表三个科室的面试官人数,用英文逗号分隔
若小招需要出差,则输出:1;
若小招不需要出差,则输出:第一步选择的科室名称和选择人数,用英文逗号分隔
1,8,9
1
2,0,4
C,2
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String inputString = sc.next().toString(); String stringArray[] = inputString.split(","); int num[] = new int[stringArray.length]; for (int i = 0; i < stringArray.length; i++) { num[i] = Integer.parseInt(stringArray[i]); } int a = num[0]; int b = num[1]; int c = num[2]; int bool = a ^ b ^ c; if (bool == 0) System.out.print(1); else { if ((a ^ b) < c) { System.out.print("C," + (c - (a ^ b))); } if ((a ^ c) < b) { System.out.print("B," + (b - (a ^ c))); } if ((b ^ c) < a) { System.out.print("A," + (a -(b ^ c))); } } } }
#include <iostream> using namespace std; int HighBit(int a) { int cnt = 0; while (a) { a >>= 1; cnt++; } return cnt; } int main() { char c1, c2; int room[3]; cin >> room[0] >> c1 >> room[1] >> c2 >> room[2];//scanf可以格式化读入 int p = 0; for (int i = 0; i < 3; i++) { p ^= room[i]; } if (!p) cout << '1' << '\n'; else { int i = 0; for (; i < 3; i++) { if (HighBit(room[i]) == HighBit(p)) //两者最高位的1相同 { p ^= room[i]; break; } } int ans; for (int j = room[i]-1; j >= 0; j--) { if (!(p^j)) { ans = room[i] - j; break; } } cout << (char)('A' + i) << ',' << ans << '\n'; } return 0; }
#include <iostream> #include <vector> class Solution { public: bool isFree2Travel(const std::vector<int> &Interviewer) { int XOR = 0; for (auto &val:Interviewer) { XOR = XOR ^ val; } if (XOR == 0) { return false; } else { BestStrategy(Interviewer); return true; } } char getDepartment() { return this->Department; } int getCount() { return this->Count; } private: void BestStrategy(const std::vector<int> &Interviewer) { for (auto i = 0; i != Interviewer.size(); ++i) { auto Num1 = Interviewer.at((i + 1) % Interviewer.size()), Num2 = Interviewer.at((i + 2) % Interviewer.size()); if ((Num1 ^ Num2) < Interviewer.at(i)) { Department += i; Count = Interviewer.at(i) - (Interviewer.at((i + 1) % Interviewer.size()) ^ Interviewer.at((i + 2) % Interviewer.size())); return; } } } char Department = 'A'; int Count = 0; }; int main() { int a = 0, b = 0, c = 0; scanf("%d,%d,%d", &a, &b, &c); // 如果哪位 C++ 大佬知道以英文逗号分隔的输入直接用 cin 接收的方法,希望能抬小弟一手告诉小弟一下,感激不尽 std::vector<int> vi; vi.push_back(a); vi.push_back(b); vi.push_back(c); Solution s; if (s.isFree2Travel(vi)) { std::cout << s.getDepartment() << "," << s.getCount() << std::endl; } else { std::cout << 1 << std::endl; } return 0; }