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 } View CodeB - 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 } View CodeC - 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 } View Code轉載于:https://www.cnblogs.com/love-fromAtoZ/p/7736147.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Codeforces #440.Div.2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3爬虫知识点总结
- 下一篇: 04-String课后动手动脑