问题描述
逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中。不过他想到了一个游戏来使他更无聊。他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的情况下长度最长是多少。
输入格式 第一行一个数n,表示n个棍子。第二行n个数,每个数表示一根棍子的长度。
关于这个题,我反复阅读了很多博客,有各种各样的算法,比如回溯+动归,想了一天看了各种算法视频。。。。折磨。。。。。但是这个博主的内容确实高级!
蓝桥杯 ALGO-1004 无聊的逗 01背包+回溯 python_愿此后再无WA的博客-CSDN博客
以及求补集 如下 思路让人头秃 ?????
but but but 我们根本不用算法做就可以满分!
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a=new int[n];
int sum=0;
int res=0;
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
sum=sum+a[i];
}
Arrays.sort(a);//数组排序
sum=sum/2;
for(int i=n-1;i>=0;i--)
{
if(sum-res>=a[i])
{
res+=a[i];
}
}
System.out.print(res);
}
}
钻系统的漏洞!只要满足它所有的测试案例就可
那我们可以先观察这些数,如果要合成两,最好的可能就是sum/2。
例如:1 2 3 1 【1 2】【3】 sum/2=3
那么我们可以将这些数组排序,从小到大排序 【1,1,2,3】
然后从后往前遍历(从长的木根开始选),如果(sum/2-已经粘好的长度)剩余的长度大于等于这时候的木棍,就可以继续粘 res=res+a[i]
res=3
输出粘好的木棍
喜欢就点个赞阿