题目:https://codeforces.com/contest/1196/problem/B
将长度为n的数组a划分成k个非空组,确保所有的组内之和都为奇数。
本来以为是要输出所有的可行解,所以想了一个O(n^k)的解法,结果超时。后来发现只需要输出一组解即可。
首先计算数组中奇数个数,如果奇数个数等于k,则每组一个奇数,满足需求。
如果奇数个数比k大奇数个,则这些奇数一定会导致一个组的和变成偶数,不满足。如果奇数个数比k大偶数个,则满足要求。
然后就是如何构造序列的问题了。
首先,对于前k-1个序列,每个序列仅包含一个奇数,最后剩下的一个组包含剩下的数字,很容易可以想到,最后一个组一定包含了奇数个奇数。
另外,java.util.Scanner有性能问题,还是使用自己实现的FastReader
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; import java.util.StringTokenizer;
public class Main { private static void process(int[] arr, int segs) { int[] indexes = new int[arr.length]; int index = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] % 2 == 1) { indexes[index++] = i; } } if (index < segs || (index - segs) % 2 == 1) { System.out.println("NO"); return; } System.out.println("YES"); for (int i = 0; i < segs - 1; i++) { System.out.print(indexes[i] + 1); System.out.print(" "); } System.out.println(arr.length); }
public static void main(String[] args) { FastReader scn=new FastReader(); int tn = scn.nextInt(); while (tn-- > 0) { int n = scn.nextInt(); int seg = scn.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scn.nextInt(); } process(arr, seg); } }
static class FastReader { BufferedReader br; StringTokenizer st;
public FastReader() { br = new BufferedReader(new InputStreamReader(System.in)); }
String next() { while (st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); }
int nextInt() { return Integer.parseInt(next()); }
long nextLong() { return Long.parseLong(next()); }
double nextDouble() { return Double.parseDouble(next()); }
String nextLine() { String str = ""; try { str = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } } }
|