Codeforces #440.Div.2
Posted 薛定谔的Submit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces #440.Div.2相关的知识,希望对你有一定的参考价值。
A - Search for Pretty Integers
题目大意:
给两组数。给一个叫“pretty integer”的定义。
如果这个数至少有一位来自第一个数组,又有一位来自第二个数组,那么这个数就是 pretty integer。
要求找出最小 pretty integer。
输入一行两个整数:n,m。分别代表接下来的两个数组大小(n,m ∈ [1,9])。
输入一行n 个整数:代表第一个数组(n[i] ∈ [1,9])。
输入一行m 个整数:代表第二个数组(m[i] ∈ [1,9])。
输出一行一个整数:代表所得出的最小 pretty integer。
样例输入:2 3 8 8
4 2 1 2 3 4 5 6 7 8
5 7 6 8 7 6 5 4 3 2 1
样例输出:25 1
解题思路:
暴力查询组合所有符合题意的数,不断更新最小值,如果组合出11的倍数,最小值更新成1,2,3...等等。
A C 代码:
1 import java.util.*; 2 3 public class Main{ 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 while(sc.hasNext()){ 7 int n = sc.nextInt(); 8 int m = sc.nextInt(); 9 int a[] = new int[n]; 10 int b[] = new int[m]; 11 for(int i = 0;i < n;i ++){ 12 a[i] = sc.nextInt(); 13 } 14 for(int i = 0;i < m;i ++){ 15 b[i] = sc.nextInt(); 16 } 17 Arrays.sort(a); 18 Arrays.sort(b); 19 int ans = 10000000; 20 for(int i = 0;i < n;i ++){ 21 for(int j = 0;j < m;j ++){ 22 if(a[i] == b[j]){ans = Math.min(ans,a[i]); } 23 ans = Math.min(ans,Math.min(a[i],b[j]) * 10 + Math.max(a[i],b[j])); 24 } 25 } 26 System.out.println(ans); 27 } 28 } 29 }
B - Maximum of Maximums of Minimums
题目大意:
给出一组数,将这组数分割成若干个集合。
求出每个集合中的最小值的最大值的最大可能值。
输入一行两个整数:n,k。n代表接下来有n个数,k代表恰好分成若干个区间(1 <= k <= n <= 1e5)。
输入一行n 个整数:代表被分割的集合(每个数字 ∈ [-1e9,1e9])。
输出一行一个整数:代表得出的最大值。
样例输入:5 2 5 1
1 2 3 4 5 -4 -5 -3 -2 -1
样例输出:5 -5
解释样例:
第一个集合被拆分成两个有如下可能:
可以被拆分成{1}{2,3,4,5},最大值是2;
可以被拆分成{1,2}{3,4,5},最大值是3;
可以被拆分成{1,2,3}{4,5},最大值是4;
可以被拆分成{1,2,3,4}{5},最大值是5;
所以输出5。
解题思路:
本题稍作思考,即可发现规律。
正好被分成一个集合,最大值就是这组数据的最小值。
大于等于3个集合,最大值就是这组数据的最大值。
只需将最大值独立出来,剩下的集合分成两个集合,就能得到这个答案。
若恰好分成两个集合,从解释样例一可以看出,只需要比较这组数据的第一个值与最后一个值,然后输出这两个中的较大值即可。
A C 代码:
1 import java.util.*; 2 3 public class Main{ 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 while(sc.hasNext()){ 7 int n = sc.nextInt(); 8 int k = sc.nextInt(); 9 int m[] = new int[n]; 10 int max = -1000000002; 11 int min = 1000000002; 12 for(int i = 0;i < n;i ++){ 13 m[i] = sc.nextInt(); 14 if(m[i] > max){max = m[i];} 15 if(m[i] < min){min = m[i];} 16 } 17 if(k == 1){System.out.println(min);} 18 else if(k == 2){System.out.println(Math.max(m[0],m[n - 1]));} 19 else{System.out.println(max);} 20 } 21 } 22 }
C - Maximum splitting
题目大意:
求任意一个数能否被分成若干个合数的和(合数,即非素数,不包括1和0)。若能,输出最多能分割的数量,若不能输出 -1。
输入一行一个整数:q,代表共有多少个数被判断(q ∈ [1,1e5])。
输入q 行q 个整数:每个数都进行上述计算(q[i] ∈ [1,1e9])。
输出q 行q 个整数:代表得出的结果。
样例输入:1 2 3
12 6 1
8 2
3
样例输出:3 1 -1
2 -1
-1
解题思路:
根据样例,1,2,3都输出 -1。
要想拆分的最多,应该保证每个合数都尽可能小。
因为最小的合数是4,最小的奇数和数是9,但是不是所有偶数都能被4整除,所以需要引进第二个合数6。
然后思路十分明确,奇数先减9,然后一直减6直到剩下的数能被4整除。偶数则不需要减9,直接进行后面的计算。
A C 代码:
1 import java.util.*; 2 3 public class Main{ 4 5 public static void main(String[] args){ 6 Scanner sc = new Scanner(System.in); 7 while(sc.hasNext()){ 8 int n = sc.nextInt(); 9 for(int I = 0;I < n;I ++){ 10 int ans = 0; 11 int t = sc.nextInt(); 12 if(t <= 3){System.out.println("-1");} 13 else if(t == 5 || t == 7 || t == 11){System.out.println("-1");} 14 else{ 15 if(t % 2 == 1){t = t - 9;ans ++;} 16 while(t % 4 != 0){ 17 t = t - 6; 18 ans ++; 19 } 20 ans = ans + t / 4; 21 System.out.println(ans); 22 } 23 } 24 } 25 } 26 }
以上是关于Codeforces #440.Div.2的主要内容,如果未能解决你的问题,请参考以下文章
[日常] Codeforces Round #440 Div.2 大力翻车实况
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段