题目
题意及思路
题意:给定一串序列并给定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();
}
} 
京公网安备 11010502036488号