2 条题解

  • 0
    @ 2024-8-18 12:08:16

    验题人做法

    AA 先删,必胜条件就是第一次删除自己左右端点处不等于 BB 的左右端点处的值。

    BB 左右两边的值都和 AA 左右两边的一样,AA 就只能退一步,看倒数第二的和正数第二的能和 BB 一样不,假如都一样的,以此类推。

    最后 AA 没有找到不一样的删,那么 BB 就赢了。

    通俗的意思就是,如果一个数组和另一个数组相等或者反转后和另一个数组相等,那么 AA 就输了。反之则必胜。

    #include <bits/stdc++.h>
    
    using u32 = unsigned;
    using i64 = long long;
    using u64 = unsigned long long;
    using i128 = __int128;
    
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(nullptr);
    
    	int n;
    	std::cin >> n;
    	std::vector<int> a(n), b(n), c(n);
    
    	for (int i = 0; i < n; i++) {
    		std::cin >> a[i];
    	}
    	for (int i = 0; i < n; i++) {
    		std::cin >> b[i];
    	}
    	c = b;
    
    	reverse(b.begin(), b.end());
    
    	if (a == b || a == c) {
    		std::cout << "1\n";
    	} else {
    		std::cout << "0\n";
    	}
    
    
    	return 0;
    }
    
    • 0
      @ 2024-8-18 11:07:53

      博弈。AA 先手,当 AA 的左右两侧存在一个数,这个数不等于 BB 的左右两侧任何一个数时,AA 可以删除这个数,然后 BB 无法删除这个数,只能删除 BB 两侧其中一个,记 BB 删除这个数为 numnum,此时对 AA 来说当前数字序列还保留着 numnumBB 内没有 numnum,即 AA 可以保留 numnum 这个数,而BB最后一定不会和 AA 剩下的 numnum 相等, AA 胜利。反之不存在这个数使得其不等于 BB 两侧的任何一个数,即 AA 两侧两个数,分别对应 BB 两侧的两个数,则 BB 可以通过后手删除 AA 删除的数直到最后和 AA 相等。

      inline void solve()
      {
          int n;
          cin>>n;
          vector<int>a(n+3),b(n+3);
          for(int i=1;i<=n;i++)cin>>a[i];
          for(int i=1;i<=n;i++)cin>>b[i];
          int al=1,ar=n,bl=1,br=n;
          while(al<ar)
          {
              if(a[al]!=b[bl]&&a[al]!=b[br]){
                  cout<<"0";
                  return;
              }
              if(a[ar]!=b[bl]&&a[ar]!=b[br]){
                  cout<<"0";
                  return;
              }
      		//当前检查一次
      
              int sy=0;
              if(a[al]==b[bl]){
                  if(a[al+1]!=b[bl+1]&&a[al+1]!=b[br])sy=1;
              }else if(a[al]==b[br]){
                  if(a[al+1]!=b[br-1]&&a[al+1]!=b[bl])sy=1;
              }
      
              if(a[ar]==b[br]){
                  if(a[ar-1]!=b[br-1]&&a[ar-1]!=b[bl])sy=1;
              }else if(a[ar]==b[bl]){
                  if(a[ar-1]!=b[bl+1]&&a[ar-1]!=b[br])sy=1;
              }
              if(sy){
                  cout<<"0";
                  return;
              }
      		//一次删两个数,分别检查左右是否存在删除这边时,下一个就是num
              if(a[al]==b[bl]){
                  al++,bl++;
              }else if(a[al]==b[br]){
                  al++,br--;
              }
      
              if(a[ar]==b[br]){
                  ar--,br--;
              }else if(a[ar]==b[bl]){
                  ar--,bl++;
              }
      
          }
          cout<<"1";
      }
      
      • 1

      信息

      ID
      56
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      40
      已通过
      11
      上传者