第二题:数星星
一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。
牛牛把星星图看成一个平面,左上角为原点(坐标为(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
*
*/
不会做。。。。。无向图的最短路径问题。。图方面的题是短板。伤