题目:甲有m个橘子分别为n克,每次找到平均数,要么丢弃比它大的,要么丢弃比它小的,将剩下的和记为s,不断循环
要求输入一些数字,其与s比较,有则输出YES,无则输出NO。
第一行输入橘子个数与要比较的数字的个数
第二行输入橘子重量
第三行到结束输入要求比较的重量
例如:
输入:6 3
1 3 4 5 6 8
7
8
12
输出:YES
YES
NO
import java.sql.SQLOutput;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int a[]=new int[input.nextInt()];
int b[]=new int[input.nextInt()];
int sum=0;
String e[]=new String[b.length];
for (int i = 0; i < e.length; i++) {
e[i]="NO";
}
int d=0;
for (int i = 0; i < a.length; i++) {
a[i]=input.nextInt();
sum=sum+a[i];
}
for (int i = 0; i < b.length; i++) {
b[i]=input.nextInt();
}
e=suan(a,b,e);
for (int i = 0; i < e.length; i++) {
if (b[i]==sum){
e[i]="YES";
}
}
for (int i = 0; i < e.length; i++) {
System.out.println(e[i]);
}
}
static String[] suan(int[] a,int []h,String e[]){
int b[]=new int[a.length];
int c[]=new int[a.length];
int m[]=new int[a.length];
int n[]=new int[a.length];
m[0]=0;n[0]=0;
int num=0,nums=0,s=0,sum1=0,sum2=0,m1=1,n1=1,j=0,k=0;
for (int i = 0; i < a.length; i++) {
num=num+a[i];
if (a[i]!=0){s++;}
}
nums=num/s;
for (int i = 0; i < a.length; i++) {
if(a[i]>nums){
sum1=sum1+a[i];
b[i]=a[i];
}
}
for (int i = 0; i < e.length; i++) {
if(h[i]==sum1){
e[i]="YES";
}
}
for (int i = 0; i < b.length; i++) {
if(b[i]!=0){
m[m1]=b[i];
if(b[i]!=m[1]){
j++;
}
}
}
if (j!=0){
suan(b,h,e);
}
for (int i = 0; i < a.length; i++) {
if(a[i]<=nums){
sum2=sum2+a[i];
c[i]=a[i];
}
}
for (int i = 0; i < e.length; i++) {
if(h[i]==sum2){
e[i]="YES";
}
}
for (int i = 0; i < c.length; i++) {
if(c[i]!=0){
n[n1]=b[i];
if(b[i]!=m[1]){
k++;
}
}
}
if (k!=0){
suan(c,h,e);
}
return e;
}
}
广度优先方法。
递归方式解决问题,将数据导入递归方法,每次递归比较一次是否有一致的,一致的修改,不一致,不改,最后返回出所有结果的比较,然后取答案,当时笔试的时候想到的。
后来思考,深度优先更好,可以每个需要比较的结果进入一个方法,如果有返回值就结束,无返回值,一直进行,直到比较完,代码量要小很对,时间复杂度也小一些。