按照卡中心校园招聘的要求,HR小招和小商需要从三个科室中(分别为A、B、C)抽派面试官去往不同城市。
两名HR按照以下规定轮流从任一科室选择面试官:每次至少选择一位,至多选择该科室剩余面试官数。最先选不到面试官的HR需要自己出差。
假设HR小招和小商都不想出差且每次选择都采取最优策略,如果是小招先选,写一个函数来判断她是否需要出差。如果不需要出差,请给出第一步的最优策略。
输入为三个正整数,分别代表三个科室的面试官人数,用英文逗号分隔
若小招需要出差,则输出:1;
若小招不需要出差,则输出:第一步选择的科室名称和选择人数,用英文逗号分隔
1,8,9
1
2,0,4
C,2
#include <bits/stdc++.h> using namespace std; int main(){ int n, a[3], s; scanf("%d,%d,%d", &a[0], &a[1], &a[2]); s = a[0] ^ a[1] ^ a[2]; if(s==0) printf("1\n"); else{ for(int i=0;i<3;i++){ int x = s ^ a[i]; if(a[i]-x < 0) continue; printf("%c,%d\n", 'A'+i, a[i]-x); } } return 0; }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * Nim游戏 * @author wylu */ public class Main { static String[] room = {"A", "B", "C"}; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strs = br.readLine().split(","); int[] a = new int[strs.length]; int k = 0; for (int i = 0; i < strs.length; i++) { a[i] = Integer.parseInt(strs[i]); k ^= a[i]; } if (k == 0) { //P-position,先手必败 System.out.println(1); } else { //N-position,先手必胜 for (int i = 0; i < a.length; i++) { //寻找N-position移动到某个P-position的方法 int num = k ^ a[i]; if (a[i] - num >= 0) { System.out.println(room[i] + "," + (a[i] - num)); break; } } } } }
#include<stdio.h> #include<iostream> using namespace std; pair<char,int> choose(int a,int b,int c){ if(a==0&&b==0&&c==0) return {'D',0}; if(a==0&&b==0) return {'C',c}; if(a==0&&c==0) return {'B',b}; if(b==0&&c==0) return {'A',a}; pair<char,int> tmp; for(int i=a;i>=1;i--){ tmp=choose(a-i,b,c); if(tmp.second==0) return {'A',i}; } for(int i=b;i>=1;i--){ tmp=choose(a,b-i,c); if(tmp.second==0) return {'B',i}; } for(int i=c;i>=1;i--){ tmp=choose(a,b,c-i); if(tmp.second==0) return {'C',i}; } return {'D',0}; } int main(){ int a,b,c; scanf("%d,%d,%d",&a,&b,&c); pair<char,int> tmp=choose(a,b,c); if(tmp.second==0) cout<<1<<endl; else cout<<tmp.first<<","<<tmp.second<<endl; return 0; }