牛客网IT校招全国统一模拟笔试(六月场)java方向

第二题:数星星

一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。
牛牛把星星图看成一个平面,左上角为原点(坐标为(1, 1))。现在有n颗星星,他给每颗星星都标上坐标(xi,yi),表示这颗星星在第x行,第y列。
现在,牛牛想问你m个问题,给你两个点的坐标(a1, b1)(a2,b2),表示一个矩形的左上角的点坐标和右下角的点坐标,请问在这个矩形内有多少颗星星(边界上的点也算是矩形内)。
输入描述:
第一行输入一个数字n(1≤n≤100000),表示星星的颗数。
接下来的n行,每行输入两个数xi和yi(1≤xi,yi≤1000),表示星星的位置。
然后输入一个数字m(1≤m≤100000), 表示牛牛询问问题的个数。
接下来m行,每行输入四个数字a1,b1,a2,b2(1≤a1<a2≤1000), (1≤b1<b2≤1000)
题目保证两颗星星不会存在于同一个位置。
输出描述:
输出一共包含m行,每行表示与之对应的每个问题的答案。
示例1
输入
4
1 1
2 2
3 3
1 3
4
1 1 2 2
1 1 3 3
2 2 3 3
1 2 2 3
输出
2
4
2

2

思路就是首先新建一个1001x1001的data数组,表示所有可能的坐标,然后输入每一个星星的坐标,把对应位置置为1 其余位置默认为0 

第二步,遍历data数组,累加,可以画图理解,就是加出来一个当前点到(1,1)点的矩形阵列。

第三部,根据给出的两个点,切割出对应的矩形阵列。同样画图理解,画出来很容易理解。

代码如下:

public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[][] data = new int[1001][1001];
		for(int i=0;i<n;i++){
			data[in.nextInt()][in.nextInt()] = 1;
		}
		//累加data,data[i][j]表示(i,j)和(1,1)构成的矩形阵列中的星星总数
		for(int i=1;i<data.length;i++){
			for(int j=1;j<data.length;j++){
				data[i][j]+=data[i][j-1]+data[i-1][j]-data[i-1][j-1];
			}
		}
				
		int m = in.nextInt();		
		for(int i=0;i<m;i++){
			int a1 = in.nextInt();
			int b1 = in.nextInt();
			int a2 = in.nextInt();
			int b2 = in.nextInt();
			//分割出来所需的矩形阵列
			int sum=data[a2][b2]-data[a2][b1-1]-data[a1-1][b2]+data[a1-1][b1-1];			
			System.out.println(sum);
		}

		in.close();
	}


第一题:比扑克牌

牛牛与妞妞闲来无聊,便拿出扑克牌来进行游戏。游戏的规则很简单,两个人随机抽取四张牌,四张牌的数字和最大的取胜(该扑克牌总张数为52张,没有大小王,A=1,J=11,Q=12,K=13,每种数字有四张牌),现在两人已经分别亮出了自己的前三张牌,牛牛想要知道自己要赢得游戏的概率有多大。
输入描述:
输入包含两行,第一行输入三个整数a1,b1,c1(1≤a1,b1,c1≤13),表示牛牛亮出的扑克牌。
第二行输入三个整数a2,b2,c2(1≤a2,b2,c2≤13),表示妞妞所亮出的扑克牌。
输出描述:
输出一个数字x(保留4位小数),表示牛牛获胜的概率。
示例1
输入
3 5 7
2 6 8
输出

0.3905


尴尬,只通过了一部分。

我的思路是,利用线性规划,以给出的手牌差值作为变量,移动直线,求复合要求的比例。画图辅助。

不过有一点要注意的是,要赢就必须手牌总和大于另一人才行,小于等于都不算赢。

代码如下:但是只通过一部分,测试案例可以通过,可能是边界条件或者特殊情况没有考虑到。

public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int[] arr1 = new int[3];
		int[] arr2 = new int[3];
		double sum1 = 0;
		double sum2 = 0;
		for(int i=0;i<3;i++){
			arr1[i] = in.nextInt();
			sum1+=arr1[i];
		}
			
		for(int i=0;i<3;i++){
			arr2[i] = in.nextInt();
			sum2+=arr2[i];
		}
		double x = sum1-sum2;	
		if(x>12){
			System.out.println(1.0000);
			return;
		}
		if(x<=-12){
			System.out.println(0.0000);
			return;
		}
		
		if(x<=0){
			double res = (12+x)*(13+x)/338;
			System.out.println((double)Math.round(res*10000)/10000);
		}
		if(x>0){
			double res = 1-(12-x)*(13-x)/338;
			System.out.println((double)Math.round(res*10000)/10000);
		}
			
		
		
		in.close();
	}


第三题:逛公园



/**
 * 又是晴朗的一天,牛牛的小伙伴们都跑来找牛牛去公园玩。但是牛牛想呆在家里看E3展,不想出去逛公园,可是牛牛又不想鸽掉他的小伙伴们,于是找来了公园的地图,
 * 发现公园是由一个边长为n的正方形构成的,公园一共有m个入口,但出口只有一个。公园内有一些湖和建筑,牛牛和他的小伙伴们肯定不能从他们中间穿过,所以只能绕行。
 * 牛牛想知道他需要走的最短距离并输出这个最短距离。 输入描述: 第一行输入一个数字n(1≤n≤1000)表示公园的边长
 * 接下来会给你一个n*n的公园地图,其中 .
 * 表示公园里的道路,@表示公园的入口,*表示公园的出口,#表示公园内的湖和建筑。牛牛和他的小伙伴们每次只能上下左右移动一格位置。
 * 输入保证公园入口个数m(1≤m≤10000)且所有的入口都能和出口相连。 输出描述: 输出牛牛需要行走的最短距离。 示例1 输入 10
 * .@....##@. 
 * ......#... 
 * ...@..#...
 * ###....... 
 * ....##..#. 
 * ...####... 
 * @...##....
 * #####..... 
 * ..##*####. 
 * #......... 
 * 输出 16
 * 
 * @author kafka
 *
 */

不会做。。。。。无向图的最短路径问题。。图方面的题是短板。伤

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值