Codeforces Round 925 (Div. 3) E. Anna and the Valentine’s Day Gift (Java)
比赛链接:Codeforces Round 925 (Div. 3)
E题传送门:E. Anna and the Valentine’s Day Gift
题目:E. Anna and the Valentine’s Day Gift
样例 #1
样例输入 #1
9
2 2
14 2
3 5
9 56 1
4 10
1 2007 800 1580
4 5
5000 123 30 4
10 10
6 4 6 2 3 1 10 9 10 7
1 1
6
1 1
10
8 9
1 2 9 10 10 2 10 2
4 5
10 10 10 10
样例输出 #1
Sasha
Anna
Anna
Sasha
Sasha
Anna
Anna
Anna
Sasha
分析:
根据题目,我们只需要判断最后剩下的数是否大于 10m,而 0 ≤ m ≤ 2⋅106,数字太大,我们只能用字符串来处理答案,等价于最后剩下的数的长度是否大于m
我们知道,一个数发生反转,非0的数字和位于两个非0之间的数字0不会消失。
如 1234发生反转长度还是4位,12001发生反转长度还是5位。
我们定义 cnt 计算数的长度。
我们遍历先遍历数组a[i],对于每个a[i],我们计算这个数发生反转一定不会消失的数字个数,并将尾部0的个数添加到 list 集合中。
循环完毕后,我们得到cnt的值,接下来可以处理尾部0是否可以作为最后数字的一部分。
我们将list集合升序排列,定义len是list集合的长度,从list集合的第 n-1,n-3,n-5,… 的元素对应的尾部0,Anna操作都会消失,而第 n-2,n-4,n-6,…的元素对应的尾部0,Sasha操作我们可以保留,作为最后剩余数字的一部分。
最后得到的 cnt 是最后剩余数字长度的最大值,如果cnt > m,则 Sasha 胜利,否则 Anna 胜利。
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tr = sc.nextInt();
while(tr-->0) {
int n = sc.nextInt();int m = sc.nextInt();
String [] a = new String [n];
List<Integer> list = new ArrayList<>();
for(int i = 0;i < n;i++) {
a[i] = sc.next();
}
long cnt = 0;
for(int i = 0;i < n;i++) {
int len = a[i].length();
cnt += len;int cnt0 = 0;
for(int j = len-1;j >= 0;j--) {
if(a[i].charAt(j)=='0') {
cnt--;cnt0++;
}else {
break;
}
}
if(cnt0>0) list.add(cnt0);
}
Collections.sort(list);
int len = list.size();
for(int i = len-2;i >=0;i-=2) {
cnt += list.get(i);
}
if(cnt > m) {
System.out.println("Sasha");
}else {
System.out.println("Anna");
}
}
sc.close();
}
}