Day06 ----题目 3179: 蓝桥杯2023年第十四届省赛真题-平均

原理链接:

题目 3179: 蓝桥杯2023年第十四届省赛真题-平均

做题情况:

在这里插入图片描述

第一次尝试:

一开始没理解透彻,只以为每个数只取第一位,导致程序错误,当然了第一种方法也是最好理解的,可以给大家小白们提供参考,然后了由于时间关系,没有进行矫正,大家自己自行理解并加以改一下,便可以运行,

  1. 采用多个数组,然后放进去,去0
package Dotcpp;

import java.util.Arrays;
import java.util.Scanner;

public class 题目3179蓝桥杯2023年第十四届省赛真题__平均 {
	private static int ai,bi;
	private static int arr_0[] = new int[1000002];
	private static int arr_1[] = new int[1000002];
	private static int arr_2[] = new int[1000002];
	private static int arr_3[] = new int[1000002];
	private static int arr_4[] = new int[1000002];
	private static int arr_5[] = new int[1000002];
	private static int arr_6[] = new int[1000002];
	private static int arr_7[] = new int[1000002];
	private static int arr_8[] = new int[1000002];
	private static int arr_9[] = new int[1000002];


	private static int n;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		//ai_arr = new int[n];
		//bi_arr = new int[n];
		int ans = 0;
		for (int i=0;i<n;i++){
			int ai = scanner.nextInt();
			int bi = scanner.nextInt();
			if (ai==0){
				arr_0[i] = bi;
			} else if (ai==1) {
				arr_1[i] = bi;
			}else if (ai==2) {
				arr_2[i] = bi;
			}else if (ai==3) {
				arr_3[i] = bi;
			}else if (ai==4) {
				arr_4[i] = bi;
			}else if (ai==5) {
				arr_5[i] = bi;
			}else if (ai==6) {
				arr_6[i] = bi;
			}else if (ai==7) {
				arr_7[i] = bi;
			}else if (ai==8) {
				arr_8[i] = bi;
			}else {
				arr_9[i] = bi;
			}
		}

		Arrays.sort(arr_0);
		Arrays.sort(arr_1);
		Arrays.sort(arr_2);
		Arrays.sort(arr_3);
		Arrays.sort(arr_4);
		Arrays.sort(arr_5);
		Arrays.sort(arr_6);
		Arrays.sort(arr_7);
		Arrays.sort(arr_8);
		Arrays.sort(arr_9);

			for (int j=arr_0.length-2;j>=0;j--){
//				if (arr_0[j]==0){
//					break;
//				}else {
//
//				}
				ans+=arr_0[j];
			}
		for (int j=arr_1.length-2;j>=0;j--){
//			if (arr_1[j]==0){
//				break;
//			}else {
//
//			}
			ans+=arr_1[j];
		}
		for (int j=arr_2.length-2;j>=0;j--){
//			if (arr_2[j]==0){
//				break;
//			}else {
//				ans+=arr_2[j];
//			}
			ans+=arr_2[j];
		}
		for (int j=arr_3.length-2;j>=0;j--){
//			if (arr_3[j]==0){
//				break;
//			}else {
//				ans+=arr_3[j];
//			}
			ans+=arr_3[j];
		}
		for (int j=arr_4.length-2;j>=0;j--){
//			if (arr_4[j]==0){
//				break;
//			}else {
//				ans+=arr_4[j];
//			}
			ans+=arr_4[j];
		}
		for (int j=arr_5.length-2;j>=0;j--){
//			if (arr_5[j]==0){
//				break;
//			}else {
//				ans+=arr_5[j];
//			}
			ans+=arr_5[j];
		}
		for (int j=arr_6.length-2;j>=0;j--){
//			if (arr_6[j]==0){
//				break;
//			}else {
//				ans+=arr_6[j];
//			}
			ans+=arr_6[j];
		}
		for (int j=arr_7.length-2;j>=0;j--){
//			if (arr_7[j]==0){
//				break;
//			}else {
//				ans+=arr_7[j];
//			}
			ans+=arr_7[j];
		}
		for (int j=arr_8.length-2;j>=0;j--){
//			if (arr_8[j]==0){
//				break;
//			}else {
//				ans+=arr_8[j];
//			}
			ans+=arr_8[j];
		}
		for (int j=arr_9.length-2;j>=0;j--) {
//			if (arr_9[j] == 0) {
//				break;
//			} else {
//				ans += arr_9[j];
//			}
			ans += arr_9[j];
		}

		System.out.println(ans);
	}

}

第二次尝试:

package Dotcpp;

import java.util.Arrays;
import java.util.Scanner;

public class 题目3179蓝桥杯2023年第十四届省赛真题__平均_AC {
	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		int n = scanner.nextInt();
		int dp[][]=new int[12][100002];
		int len[] = new int[12];
		for(int i=1;i<=n;i++){
			int x = scanner.nextInt();
			int y = scanner.nextInt();
			dp[x][++len[x]] = y;
		}
		for (int i=0;i<=9;i++){
			Arrays.sort(dp[i],1,len[i]+1);
		}
		long ans = 0L;
		for (int i=0;i<10;i++){
			for (int j=1;j<=len[i]-n/10;j++){
				ans+=dp[i][j];
			}
		}
		System.out.println(ans);
	}

}

分析:

1.构造一个**int len[] = new int[12];**数组,对0-9序号进行标记,多加几个,习惯了。
2.对这条语句理解了,那么你这道题就没问题了:

dp[x][++len[x]] = y;

一、len[1]代表的序号1的数组,然后每++一次,即长度加一,即当前dp[x][i]开始增加数据。
二、Arrays.sort(dp[i],1,len[i]+1); 顾名思义,不多解释什么意思。
三、j<=len[i]-n/10 因为确保要均分,所以len[i]-n/10即表示,当前序号的长度-平均长度,即多出来的长度,即对多出来的序号内的数组,进行调整。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值