CSDN第11期周赛题解
1.圆小艺
最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球!
小艺酱得到n个同心圆。 小艺酱对着n个同心圆进行染色。相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。
小艺酱想知道圆最外层的那种颜色全部染了多少?
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str_0 = scan.nextLine().trim();
int n = Integer.parseInt(str_0);
String str_1 = scan.nextLine();
String[] line_list_1 = str_1.trim().split(" ");
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 0; i < line_list_1.length; i++){
arr.add(Integer.parseInt(line_list_1[i]));
}
scan.close();
double result = solution(n, arr);
System.out.printf("%.3f", result);
}
public static double solution(int n, ArrayList<Integer> arr){
double result = 0.0;
Collections.sort(arr);
if(n % 2 == 0) {
for(int k = 2; k <= n; k +=2){
result += Math.PI * (Math.pow(arr.get(k - 1), 2) - Math.pow(arr.get(k - 2), 2));
}
}
else {
result += Math.PI * Math.pow(arr.get(0),2);
for(int k = 3; k <= n; k+=2){
result += Math.PI * (Math.pow(arr.get(k - 1), 2) - Math.pow(arr.get(k - 2),2));
}
}
return result;
}
}
2.K皇把妹
存在n个节点,目标节点在m。 每个节点有自己的权值a。 在权值k内(含k值)选择一个权值非0节点且与目标节点距离最近。节点i与节点j的距离为abs(i-j) 。
import java.util.ArrayList;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str_0 = scan.nextLine();
String[] line_list_0 = str_0.trim().split(" ");
ArrayList<Integer> arr_temp = new ArrayList<>();
for(int i = 0; i < line_list_0.length; i++){
arr_temp.add(Integer.parseInt(line_list_0[i]));
}
int n = arr_temp.get(0);
int m = arr_temp.get(1);
int k = arr_temp.get(2);
String str_3 = scan.nextLine();
String[] line_list_3 = str_3.trim().split(" ");
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 0; i < line_list_3.length; i++){
arr.add(Integer.parseInt(line_list_3[i]));
}
scan.close();
int result = solution(n, m, k, arr);
System.out.println(result);
}
public static int solution(int n, int m, int k, ArrayList<Integer> arr){
int result = 101;
for(int i = m; i < n; i++){
if(arr.get(i) <= k && arr.get(i) != 0) {
int a = i - m + 1;
result = Math.min(result, a);
}
}
for(int i = 0; i < m; i++) {
if(arr.get(i) <= k && arr.get(i) != 0){
int a = m - i - 1;
result = Math.min(result ,a);
}
}
return result;
}
}
3.筛选宝物
已知存在n个宝物,每个宝物都有自己的质量m和价值v,在考虑选择宝物时只能选择总质量小于等于M的方案,请问在最优方案下选择宝物,能获取到最大价值V是多少?
import java.util.ArrayList;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str_0 = scan.nextLine();
String[] line_list_0 = str_0.trim().split(" ");
ArrayList<Integer> arr_temp = new ArrayList<>();
for(int i = 0; i < line_list_0.length; i++){
arr_temp.add(Integer.parseInt(line_list_0[i]));
}
int n = arr_temp.get(0);
int M = arr_temp.get(1);
ArrayList<ArrayList<Integer>> vector = new ArrayList<>();
for(int i = 0; i < n; i++){
String str_2 = scan.nextLine();
String[] line_list_2 = str_2.trim().split(" ");
ArrayList<Integer> temp_2 = new ArrayList<>();
for(int j = 0; j < line_list_2.length; j++){
temp_2.add(Integer.parseInt(line_list_2[j]));
}
vector.add(temp_2);
}
scan.close();
int result = solution(n, M, vector);
System.out.println(result);
}
public static int solution(int n, int M, ArrayList<ArrayList<Integer>> vector){
int result = 0;
int[][] dp = new int[n][M+1];
for(int i = vector.get(0).get(0); i <= M; i++){
dp[0][i] = vector.get(0).get(1);
}
for(int i = 1; i < n; i++){
for(int j = 0; j <= M; j++){
if(j < vector.get(i).get(0)) dp[i][j] = dp[i - 1][j];
else dp[i][j] = Math.max(dp[i - 1][j], dp[i-1][j - vector.get(i).get(0)] + vector.get(i).get(1));
}
}
result = dp[n - 1][M];
return result;
}
}
4.圆桌
有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。试问主人需要准备多少个座位,才能让每个客人舒适的坐下。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
int solution(int n, std::vector<std::vector<int>>& vec){
int result=0;
// TODO:
std::vector<int>left(n),right(n);
for(int i=0;i<n;i++){
left[i]=vec[i][0];
right[i]=vec[i][1];
}
sort(left.begin(),left.end());
sort(right.begin(),right.end());
result = n;
for(int i=0;i<n;i++){
result+=std::max(left[i],right[i]);
}
return result;
} int main() {
int n;
std::cin >> n;
std::vector<std::vector<int>> vec(n, std::vector<int>(2));
for (int i = 0; i < n; i++) {
std::cin >> vec[i][0] >> vec[i][1];
}
int result = solution(n, vec);
std::cout << result << std::endl;
return 0;
}