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();}
}