原理链接:
做题情况:
第一次尝试:
一开始没理解透彻,只以为每个数只取第一位,导致程序错误,当然了第一种方法也是最好理解的,可以给大家小白们提供参考,然后了由于时间关系,没有进行矫正,大家自己自行理解并加以改一下,便可以运行,
- 采用多个数组,然后放进去,去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即表示,当前序号的长度-平均长度,即多出来的长度,即对多出来的序号内的数组,进行调整。