笔试时间:2023年9月10日 秋招  第一题  题目:文数组  多多最近在研究一种由n个数字构成的特殊数组X ={x1,x2,x3.....xn},这个数组有2个特点:  1、X数组是严格递增的,也就是x1 < t2 <···< xn;  2、X数组的相邻数字间做差值,得到新数组Y是严格递减的。换话说,用yi = xi+1 - xi表示相数字间差值,则新数组Y ={y1,y2,...,yn}满足: y1 > y2 >...>Yn-1;  现在,假设有数字n、数组的第一个数字的值a=x1以及数组最后一个数字的值b =xn的情况下,多多想知道能不能到找到任意1个这样的特殊数组,同时满足上面两个条件。  输入描述  第一行,一个整数T,表示测试用例的组数(1 <T<3000);  接下来每组测试用例包含一行数据,由3个数字构成分别是: n,a,b( 1<= n <= 400,1<=a <=b<= 1000),分别表示: 数组的长度、第个数字的值、最后一个数字的值。  输出描述  每组测试用例,输出一行:YES 或者NO表示: 是否存在任意1个这样的数组。  样例输入     3   3 1 5   5 1 5   5 1 100    样例输出     YES   NO   YES    提示  共有3组测试用例,对于第1组用例,可以找到数组:[1,4.5] 满足数组本身是严格递增的,数组相邻数字之间的差值[3,1] 是严格递减的,所以输出:YES;  对于第2组用例,严格递增的数组是:[1,2,3,4,5],但是数组相邻数字之间差值构成的数组[1,1,1,1] 不满足严格递减,所以输出:NO;  对于第3组用例,可以找到数组:[1,40,70,90,100],满足数组本身严格递增,数组相邻数字之间的差值[39,30,20,10]满足严格递减,所以输出: YES。  参考题解  通过构造数组Y,从而构造数组X,假设Y=[n-1,n-2,...1],则Xn至少等于a + n(n-1)/2。验证a + n(n-1)/2 <=b 即可。  Java:[此代码未进行大量数据的测试,仅供参考]  import java.util.Scanner;class TestCases {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int T = scanner.nextInt();        while (T-- > 0) {            int n = scanner.nextInt();            int a = scanner.nextInt();            int b = scanner.nextInt();            System.out.println(a + n * (n - 1) / 2 <= b ? "YES" : "NO");        }    }}  Python:[此代码未进行大量数据的测试,仅供参考]  def solve():    n, a, b = map(int, input().split())    print("YES" if a + n * (n - 1) // 2 <= b else "NO")if __name__ == "__main__":    T = int(input())    for _ in range(T):        solve()  第二题  题目:数字匹配  多多君从小到大都没有谈过恋爱,因此他希望大家都能成双入对,包括数字。现在他有一串数字,他希望其中的数字能两两匹配。能够两两匹配的数字满足如下要求:  1、他们之间差的绝对值大于等于一个特定值;  2、他们没有出现在其他数字对中,即每个数字只能被匹配一次或零次。  现在,多多君希望能知道,给定一串数字,最多可以匹配成功多少对数字对。  输入描述  第一行,2个整数N、M,分别表示数字的个数和要求数字间的差异值(1 < N < 2000000, 0 <M<10)  接下来一行,由N个整数构成,分别表示第i个数字Xi。(0 <=Xi<=10^9)  输出描述  一个数字,表示在给定的数字中,能匹配的最多数字对个数。  样例输入     示例一:   4 2   1 3 3 7   示例二:   5 5   10 9 5 8 7    样例输出     示例一:   2   提示:可以匹配最多2个数字对(1,3)和(3,7)。   示例二:   1   提示:可以匹配最多1个数字对(5.10),其余数字对都不满足差的绝对值大于等于5。    参考题解  二分法。  Java:[此代码未进行大量数据的测试,仅供参考]  import java.util.Arrays;import java.util.Scanner;class BinarySearchProblem {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int M = 2000004;        int[] a = new int[M];        int n = scanner.nextInt();        int m = scanner.nextInt();        for (int i = 1; i <= n; i++) {            a[i] = scanner.nextInt();        }        Arrays.sort(a, 1, n + 1);        int l = 0, r = n / 2;        while (l < r) {            int mid = (l + r + 1) >> 1;            if (ok(a, n, m, mid)) {                l = mid;            } else {                r = mid - 1;            }        }        System.out.println(l);    }    static boolean ok(int[] a, int n, int m, int k) {        for (int i = 1; i <= k; i++) {            if (a[n - k + i] - a[i] < m) {                return false;            }        }        return true;    }}  Python:[此代码未进行大量数据的测试,仅供参考]  def ok(a, n, m, k):    for i in range(1
点赞 1
评论 3
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务