#include<bits/stdc++.h>
using namespace std;

int num1=1;//左水滴数量
int num2=1;//右水滴数量

void slove()
{
   int n,p;
   cin>>n>>p;
   vector<int> a(n);
   for(int i=0;i<n;i++)
        cin>>a[i];  
    
    num1=a[p-1]==9;
    num2=num1;
    
    int l=p-2;
    int r=p;
    while(1)
    {
        if(l>=0&&num1)
        {
            a[l]++;
            num1--;
            if(a[l]==10)
            {
                l--;
                num1++;
                num2++;
            }
        }
        else if(r<=n-1&&num2)
        {
            a[r]++;
            num2--;
            if(a[r]==10)
            {
                r++;
                num1++;
                num2++;
            }   
        }
        else
            break;   
    }  
}


int main()
{
    int T;
    cin>>T;
    while(T--)
    {
      slove();
      cout<<num1<<" "<<num2<<endl;
    }
    return 0;
}
  • 过程模拟:水滴溢出
  1. 设置两个指针变量r,l,指向p的左相邻和右相邻,两个整形变量num1、num2记录左溢出和右溢出的水滴数
  2. 左相邻+1,左溢出水滴-1;右相邻+1,右溢出-1
  3. 条件判断:如果左相邻+1后等于10,左、右溢出的水滴数+1,r、l向两边走