CSDN第11期周赛题解

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值