首页 > 试题广场 >

不想出差的HR

[编程题]不想出差的HR
  • 热度指数:508 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
按照卡中心校园招聘的要求,HR小招和小商需要从三个科室中(分别为A、B、C)抽派面试官去往不同城市。
两名HR按照以下规定轮流从任一科室选择面试官:每次至少选择一位,至多选择该科室剩余面试官数。最先选不到面试官的HR需要自己出差。
假设HR小招和小商都不想出差且每次选择都采取最优策略,如果是小招先选,写一个函数来判断她是否需要出差。如果不需要出差,请给出第一步的最优策略。

输入描述:
输入为三个正整数,分别代表三个科室的面试官人数,用英文逗号分隔


输出描述:
若小招需要出差,则输出:1;
若小招不需要出差,则输出:第一步选择的科室名称和选择人数,用英文逗号分隔
示例1

输入

1,8,9

输出

1
示例2

输入

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)));
            }
        }
    }

}

发表于 2018-03-25 09:55:09 回复(1)
Nim游戏改版,异或和为0的则先手必败,所以A^B^C=0时就输出1,然后赢得情况,因为只有三个数就很简单了,枚举两两的异或和,只有第三个的值大于这个异或值,就输出第三个值减去另外两个数的异或值就是答案了。
发表于 2018-03-24 16:14:19 回复(6)
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    scanf("%d,%d,%d",&a,&b,&c);
    bool x=a^b^c;
    int result=0;
    if(x==0)
        cout<<1<<endl;
    else 
        if((a^b)<c){
            result=c-(a^b);
            cout<<"C,"<<result<<endl;}
        if((a^c)<b){
            result=b-(a^c);
            cout<<"B,"<<result<<endl;}
        if((b^c)<a){
            result=a-(b^c);
            cout<<"A,"<<result<<endl;}
    return 0;
}

发表于 2018-04-10 15:21:55 回复(0)
#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;
}
发表于 2018-04-10 23:48:35 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int a,b,c;
    scanf("%d,%d,%d",&a,&b,&c);
    bool res=a^b^c;
        if(res==0)
        {
            cout<<1<<endl;
        }
        else
        {
            if((a^b)<c)
            cout<<"C"<<","<<c-(a^b)<<endl;
            if((a^c)<b)
            cout<<"B"<<","<<b-(a^c)<<endl;
            if((b^c)<a)
            cout<<"A"<<","<<a-(b^c)<<endl;
        }
                 return 0;
}
发表于 2018-04-08 11:04:19 回复(0)
利用@phlirock 思想写的JS代码
var lines = readline().split(',');
var A=lines[0],B=lines[1],C=lines[2],result;
if(A^B^C==0){
    result=1;
}
if(C>(A^B)){
    result=`C,${C-(A^B)}`;
}else if(B>(A^C)){
    result=`B,${B-(A^C)}`;
}else if(A>(B^C)){
    result=`A,${A-(B^C)}`;
}else{
    result=1;
}
console.log(result);

发表于 2018-03-29 11:05:54 回复(0)
@phlirock 的方法是正确的~证明就很费事了(话说第一次看到 NIM 游戏还是在某大学研究生复试机试上
#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;
}

编辑于 2018-03-24 21:23:10 回复(1)