第四题:
题目:
给一个包含
n
个整数元素的集合a
,一个包含m
个整数元素的集合b
。
定义magic操作为,从一个集合中取出一个元素,放到另一个集合里,切操作过后每个集合的平均值都大于操作前。
注意一下两点:
- 不可以把一个集合的元素取空,这样就没有平均值了
- 值为
x
的元素从集合b
取出放入集合a
,但集合a
中已经有值为x
的元素,则a
的平均值不变(因为集合元素不会重复),b
的平均值可能会改变(因为x
被取出了)
问最多可以进行多少次magic操作?
输入dgdfg描述:
第一行为两个整数
n,m
第二行n
个整数,表示集合a中的元素
第三行m
个整数,表示集合b中的元素
对于100%的数据,1<n,m<1000000<a[i],b[i]<1000000001<n,m<1000000<a[i],b[i]<100000000,集合a
中元素互不相同,集合b
中的元素互不相同。
输出描述:
输出一个整数,表示最多可以进行的操作次数。
样例
in: 3 5 1 2 5 2 3 4 5 6 out: 2
贪心方法:从平均值大的setA中取比setA平均值小的且比setB大的最小元素放入setB中
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static int find_min(HashSet<Integer> set,double a,double b) {
int min=Integer.MAX_VALUE;
Iterator<Integer> it=set.iterator();
if(set.size()==1)
return -1;
while(it.hasNext()) {
int n=it.next();
if(min>n&&n<a&&n>b)
min=n;
}
if(min==Integer.MAX_VALUE)
return -1;
return min;
}
static void swap(double a,double b) {
double c= a;
a=b;
b=c;
}
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n =sc.nextInt();
int m =sc.nextInt();
double sum_n=0;
double a_n=0;
double sum_m=0;
double b_n=0;
HashSet<Integer> a=new HashSet<Integer>();
for(int i=0;i<n;i++) {
int j=sc.nextInt();
sum_n+=j;
a.add(j);
}
a_n=sum_n/n;
HashSet<Integer> b=new HashSet<Integer>();
for(int i=0;i<m;i++) {
int j=sc.nextInt();
sum_m+=j;
b.add(j);
}
b_n=sum_m/m;
if(a_n<b_n) {
HashSet<Integer> c=a;
a=b;
b=c;
double d= sum_n;
sum_n=sum_m;
sum_m=d;
d= a_n;
a_n=b_n;
b_n=d;
int f=m;
m=n;
n=f;
}
int step=0;
int min=find_min(a,a_n,b_n);
while(min!=-1) {
a.remove(min);
sum_n=sum_n-min;
n--;
a_n=sum_n/(n);
b.add(min);
sum_m=sum_m+min;
m++;
b_n=sum_m/m;
step++;
min=find_min(a,a_n,b_n);
}
System.out.println(step);
}
}