贪吃蛇

  • 其实博弈的思路已经非常明显,继续分析下去便好
  • 这种类型的题目使用双端队列进行优化的技巧也要开始掌握了
  • 使用队列,栈这种数据结构的时候要注意是否清零或者为空
  • 分类讨论,发现是递归问题 while(1)处理
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

const int maxn=4000100;

int a[maxn];
int n;

int main()
{
    int T;scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
    
        if(t==1) 
        {    
            scanf("%d",&n);
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        }
        else 
        {
            int k;scanf("%d",&k);
            for(int i=1;i<=k;i++) 
            {
                int a1,y;scanf("%d%d",&a1,&y);
                a[a1]=y;
            }
        }
        deque<pair<int,int> >q1,q2;
        for(int i=1;i<=n;i++) q1.push_back({a[i],i});
        int ans;
        while(1)
        {
            if(q1.size()+q2.size()==2)
            {
                ans=1;
                break;
            }
            int x,y,id;
            y=q1.front().first;q1.pop_front();//动作在前面 
            if(q2.empty()||!q1.empty()&&q1.back()>q2.back())
            {
                x=q1.back().first,id=q1.back().second,q1.pop_back();
            }
            else 
            {
                x=q2.back().first,id=q2.back().second,q2.pop_back();
            }
            //注意pair的定义
            pair<int,int> now=make_pair(x-y,id);
            if(q1.empty()||now<q1.front())
            {
                ans=q1.size()+q2.size()+2;
                int cnt=0;
                while(1)
                {
                    cnt++;
                    if(q1.size()+q2.size()==1)
                    {
                        if(cnt%2==0) ans--;
                        break;
                    }
                    int x,id;
                    if(q2.empty()||!q1.empty()&&q1.back()>q2.back())
                    {
                        x=q1.back().first,id=q1.back().second,q1.pop_back();
                    }
                    else
                    {
                        x=q2.back().first,id=q2.back().second,q2.pop_back();
                    }
                    now={x-now.first,id};//x取出来是大的 
                    if((now<q1.front()||q1.empty())&&(now<q2.front()||q2.empty()))
                    {
                        ;
                    }
                    else
                    {
                        if(cnt%2==0) ans--;
                        break;
                    }
                    
                }
                break;
                
            } 
            else q2.push_front(now);
            
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2020-11-29 15:38  ILH  阅读(74)  评论(0)    收藏  举报