Anna and the Valentine's Day Gift

趣味贪心题。

本题要把数字反转或拼接起来,而且没有对数字的计算操作,则可以从字符串的角度考虑本题。判断游戏最后剩下的数字 ,就是看游戏最后剩下的字符串的长度

Anna 应该可以做点什么,让字符串变短。她选择了一个数字反转之后,会丢掉前导零,此时字符串可能会变短一些(例如 的长度是 ,反转称 后长度仅为 了)。

Sasha 会尽可能地阻止 Anna 把字符串变短。具体的,他可以选择把一个数 接到 的后面组成新串 ,此时 末尾的 到了 的中间位置,Anna 不再能通过反转 使得 末尾的 消失了(例如, 拼接组成 ,无法再通过反转的方式删掉 末尾的 )。

自此,双方的贪心策略就明了了:

  • Anna 选择末尾 最多的数将其反转,删掉这些末尾的
  • Sasha 将末尾最 最多的数拼到其他任意数的前面,将这些 给“保护”起来。

我们统计出字符串的总长度和每个串末尾 的个数,从大到小依次枚举。若轮到 Anna,她可以让这些末尾 消失,那我们就从总长度中减掉这些 的数量即可。

#include<bits/extc++.h>
using namespace std;
namespace pbds=__gnu_pbds;
using ui=unsigned int;
using uli=unsigned long long int;
using li=long long int;
using uc=unsigned char;
int main(void){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    size_t T;
    cin>>T;
    while (T--){
        size_t n,m;cin>>n>>m;
        vector<uc> back_zero(n);
        size_t ans=0;
        for (uc& i:back_zero){
            string s;cin>>s;ans+=s.size();
            while (s.back()=='0') ++i,s.pop_back();
        }
        sort(back_zero.begin(),back_zero.end());
        bool turn=1;
        while (!back_zero.empty()){
            if (turn) ans-=back_zero.back();
            back_zero.pop_back();
            turn=!turn;
        }
        cout<<(ans>m?"Sasha\n":"Anna\n");
    }
    return 0;
}
posted @ 2024-02-15 00:36  MrPython  阅读(6)  评论(0)    收藏  举报  来源