codeforcesE. Anna and the Valentine‘s Day Gift
目录
题目简述:
思路:
总代码:
https://codeforces.com/problemset/problem/1931/E
题目简述:
给定两个整数n和m,以及一个长度为n的数组,现在基于这个数组,s和a俩人进行游戏比赛,a可以进行如下操作:翻转整数,也就是102->201,100->1(后导零会丢失);s可以进行如下操作:选择两个数进行任意顺序拼接。a先开始,进行到只有一个数的时候,如果这个数的位数>m,那么s赢输出s,否则a赢输出a
思路:
博弈论,我们贪心的想。两个人都会争夺具有后导零的数,所以我们对具有后导零的数单独揪到一个数组里,然后对这个数组进行排序,从多到少,a会减去后导零的个数,b会保留后导零的个数;
思路不难,但是代码有很多需要注意的点
1,我一开始是想着直接把数当做字符串进行读入,但是回车不好处理,后来按整数进行读入,再用c++内置函数to_string()把整数转换成字符串
2,后导零数组可能为空!!!此时a.size()-1<0会导致死循环!!!需要加一个判断语句
总代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
//typedef long long ll;
#define endl "\n"
#define PII pair<int,int>
//#define x first
//#define y second
//priority_queue<int, vector<int>, greater<int>> pq;//小根堆
//{并查集
//int fa[N];
//int n;
//void init(){
// for(int i=0;i<=n;i++)fa[i]=i;
//}初始化
//int get(int x){
// return fa[x]=(fa[x]==x?x:get(fa[x]));
//}查找
//void merge(int a,int b){
// fa[get(a)]=get(b);
//}合并
//}
const int N=2e5+10;
void solve(){int n,m;int ans=0;cin >> n >> m;int pp;vector<string>s;for(int i=0;i<n;i++){string ss;cin >> pp;ss=to_string(pp);s.push_back(ss);ans+=ss.size();}vector<int>a;for(int i=0;i<n;i++){int cnt=0;for(int j=s[i].size()-1;j>=0;j--){if(s[i][j]=='0')cnt++;else break;}
计算后导零的个数,如果存在后导零则将其放入a数组if(cnt)a.push_back(cnt);}sort(a.begin(),a.end());if(a.size())for(int i=a.size()-1;i>=0;i-=2){ans-=a[i];}
a进行操作,答案减去这些消去的后导零if(ans>m){cout << "Sasha" << endl;}else{cout << "Anna" << endl;}
}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr);int q;cin >> q;while(q--)solve();
}