今日头条2018 第四题

第四题:

题目:

给一个包含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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值