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;
}
浙公网安备 33010602011771号