蓝桥杯题目:卡牌
该题采用二分查找的方法去解决找到能凑出最多套的牌数。
首先分析,如何判断套数是否符合答案呢,
我们可以通过两个数组来存储已有的牌和可以第i张可以写的牌的数量来存储。
设套数为x,那么一共有三种情况,
1.x>a[i]+b[i]那么肯定是不符合的因为最多可写的和已有的加起来都不够。
2.x-a[i]>m 需要写的大于能写的总卡牌数m
3.x==a[i] 已有的卡牌就足够。
以下是代码实现:
import java.util.*;public class Main {static Scanner scanner=new Scanner(System.in);static int n = scanner.nextInt();static long m=scanner.nextLong();static long [] a=new long [n];static long [] b=new long [n];public static void main (String [] args){for( int i=0;i<n;i++){a[i]=scanner.nextLong();}for( int i=0;i<n;i++){b[i]=scanner.nextLong();}long l=0;long r=n;while(l<r){long mid =(l+r+1)/2;if(check(mid)){l=mid;}else {r=mid-1;}}System.out.println(l);}static boolean check (long mid) {for(int i=0;i<n;i++){if(a[i]>=mid){continue;}else if(b[i]+a[i]<mid||mid-a[i]>m){return false;}m-=mid-a[i];}return true;}}