题目
题意及思路
题意:给定一串序列并给定n和k,循环n次,i从1到n,每次删除现有序列中第i个数字。求,n次后,第k个数是多少(每一位数字取值为0...9)。
思路:一开始想用Java中集合存储来进行操作,结果内存超限。然后仔细看了看题目,发现每次都是删除的是原始序列中奇数位的数字,所以删除n个后,第k个数必然是原来序列的第2k个偶数位上。
代码
package com.codeforces.round68Div2; import java.util.Scanner; public class A { public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); int n, x; while (t-- > 0) { n = in.nextInt(); x = in.nextInt(); System.out.println(x * 2); } in.close(); } }
题意及思路
题意:略
思路:保存行、列上的*字符的个数,并维护一个二维数组(ArrayList实现),实现见代码。
代码关键点:见代码import step部分。每一行每一列的最大涂黑的个数为n+m-1(减去公共格子)。维护一个ans 和 每一行每一列的 cur。ans表示需要涂黑格子数,cur表示当前行列已经涂黑格子数。每次取(ans,n+m-1-cur)的较小值。
代码
package com.codeforces.round68Div2; import java.util.ArrayList; import java.util.Scanner; public class B2 { // 保存行、列的“*”数目 private static int row[] = new int[50500]; private static int col[] = new int[50500]; // 二维数组 private static ArrayList<int[]> aa = new ArrayList<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); int n, m, ans; String s; char cs[]; while (t-- > 0) { aa.clear(); n = in.nextInt(); m = in.nextInt(); for (int i = 0; i < n; i++) { row[i] = 0; } for (int i = 0; i < m; i++) { col[i] = 0; } // import step1 for (int i = 0; i < n; i++) { s = in.next(); cs = s.toCharArray(); int a[] = new int[m]; for (int j = 0; j < m; j++) { if (cs[j] == '*') { row[i]++; col[j]++; a[j] = 1; } // 否则a[j]=0 } aa.add(a); } // import step2 ans = n + m - 1; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int cur = row[i] + col[j] - aa.get(i)[j]; ans = Math.min(ans, n + m - 1 - cur); } } System.out.println(ans); } in.close(); } }