• C. Swap Game #832 div2


    Problem - C - Codeforces

    题意是给你一个序列,A先手,每次在a[1]的基础上减1,再在2<=i<=n的范围内随意选择一个数与a[1]进行交换。如果在某一次a[1]被删掉1之后变成0了,那当时的那个人就输

    分析;

    博弈论要分析必胜的状态是什么,对于这题而言

    ①如果a[1]等于1,那B必赢

    ②如果a[1]不等于1,后面的序列有1的存在,那此时的人必定换1,后者必输,前者必赢

    上面两种为初始的特判条件,下面分析一般性的问题:

    因为如果后面的序列中出现1,那后者必输,自己必赢。

    因为删减操作只可能出现在a[1],所以每个人都想要a[1]删成1,然后和后面的进行交换,那自己就赢了,所以每一次选都会选择后面的序列中最小的进行操作。

    这个可以通过循环(优先队列)来实现的,然后你就会发现会超时()

    所以这个题再自己手推一下,发现整个序列的最小值在什么地方,如果在a[1],那就是Bob赢

    否则,就是Alice赢

    下面循环(超时)和手推的代码都放一下:

    TLE:

    1. #pragma GCC optimize(1)
    2. #pragma GCC optimize(2)
    3. #pragma GCC optimize(3,"Ofast","inline")
    4. #define IOS ios::sync_with_stdio(false), cin.tie(0);
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. using namespace std;
    17. #define int long long
    18. typedef long long ll;
    19. typedef pair<int,int> PAII;
    20. const int N=2e6+10,M=5050,INF=1e18,mod=998244353;
    21. int a[N];
    22. signed main(){
    23. IOS;
    24. int T;
    25. //T=1;
    26. cin>>T;
    27. while(T--)
    28. {
    29. priority_queue<int,vector<int>,greater<int> > q;
    30. int n;
    31. cin>>n;
    32. int f=0;
    33. for(int i=1;i<=n;i++)
    34. {
    35. cin>>a[i];
    36. if(i>=2)
    37. {
    38. if(a[i]==1) f=1;
    39. q.push(a[i]);
    40. }
    41. }
    42. if(a[1]==1)
    43. {
    44. cout<<"Bob\n";
    45. continue;
    46. }
    47. if(f)
    48. {
    49. cout<<"Alice\n";
    50. continue;
    51. }
    52. int cnt=0;
    53. int now=a[1]-1;
    54. int x=1;//A
    55. while(1)
    56. {
    57. auto t=q.top();
    58. q.pop();
    59. if(now==1)
    60. {
    61. x=1-x;
    62. break;
    63. }
    64. q.push(now);
    65. now=t-1;
    66. x=1-x;
    67. }
    68. if(x) cout<<"Alice\n";
    69. else cout<<"Bob\n";
    70. }
    71. return 0;
    72. }
    73. /*
    74. */

    AC代码:

    1. #pragma GCC optimize(1)
    2. #pragma GCC optimize(2)
    3. #pragma GCC optimize(3,"Ofast","inline")
    4. #define IOS ios::sync_with_stdio(false), cin.tie(0);
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. using namespace std;
    17. #define int long long
    18. typedef long long ll;
    19. typedef pair<int,int> PAII;
    20. const int N=2e6+10,M=5050,INF=1e18,mod=998244353;
    21. int a[N];
    22. signed main(){
    23. IOS;
    24. int T;
    25. //T=1;
    26. cin>>T;
    27. while(T--)
    28. {
    29. priority_queue<int,vector<int>,greater<int> > q;
    30. int n;
    31. cin>>n;
    32. int f=0;
    33. int minn=INF;
    34. for(int i=1;i<=n;i++)
    35. {
    36. cin>>a[i];
    37. if(i>=2)
    38. {
    39. if(a[i]==1) f=1;
    40. minn=min(minn,a[i]);
    41. }
    42. }
    43. if(a[1]==1)
    44. {
    45. cout<<"Bob\n";
    46. continue;
    47. }
    48. if(f)
    49. {
    50. cout<<"Alice\n";
    51. continue;
    52. }
    53. if(minn1])
    54. {
    55. cout<<"Alice\n";
    56. continue;
    57. }
    58. if(minn>=a[1])
    59. {
    60. cout<<"Bob\n";
    61. continue;
    62. }
    63. }
    64. return 0;
    65. }
    66. /*
    67. */

  • 相关阅读:
    【C++】C 语言 和 C++ 语言中 const 关键字分析 ② ( const 常量分配内存时机 | const 常量在编译阶段分配内存 )
    适用于 Windows 的 12 个最佳 PDF 编辑器
    MySQL主从复制
    linux篇【5】:环境变量,程序地址空间
    conan2 基础入门(04)-指定编译器(gcc为例)
    Unity Render Streaming通过Js与Unity自定义通讯
    Vue中巧用computed配合watch实现监听多个属性的变化
    python语言常见面试题:如何在Python中实现列表的切片操作?
    python模式设计之责任链模式
    用了CDN就一定比不用更快吗?
  • 原文地址:https://blog.csdn.net/m0_63305704/article/details/127703017