题目描述小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试。考试结束后,小明估算出每题做对的概率,p1,p2,...,pn。
你能帮他算出他通过考试的概率吗?
输入
输入第一行一个数n(1<=n<=100),表示题目的个数。第二行n个整数,p1,p2,...,pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)
|
样例输入
4 50 50 50 50
|
输出
小明通过考试的概率,最后结果四舍五入,保留小数点后五位。
|
样例输出
0.31250
|
时间限制
C/C++语言:1000MS
其它语言:3000MS
|
内存限制
|
package cn.com.jingdong;
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
double[] p = new double[n];
double[][] dp = new double[n+1][n+1];
dp[0][0] = 1;
for( int i=0;i<n;i++){
p[i] = sc.nextInt()/100.0;
}
for(int i=1;i<=n;i++){
dp[i][0] = dp[i-1][0]*(1-p[i-1]);
for(int j =1;j<=i;j++){
dp[i][j] = dp[i-1][j-1]*p[i-1]+dp[i-1][j]*(1-p[i-1]);
}
}
double result = 0;
for(int i =(3*n+4)/5;i<=n;i++){
result += dp[n][i];
}
// BigDecimal b = new BigDecimal(result);
// double f1 = b.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue(); //四舍五入,保留小数点后5位
System.out.println(String.format("%.5f", result)); //四舍五入,保留小数点后5位,以后做题选择这种方式
}
}
}
站队(京东2017实习生真题) 题目描述有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的
人的距离为i与j之差的绝对值。
每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,
一共有多少个小偷会被警察发现吗?
输入
输入有两行,第一行一个数n(1<=n<=100000),接下来一行有一个长度为n的字符串,依次表示队伍中的每一个人。如果某一位是1-9的某个数字x,表示这一位是一个能力值为x的警察;如果某一位是字符X表示这一位是小偷;如果某一位是字符#表示这是一个普通人。输入保证不会出现其它字符。
|
样例输入
9 X1X#2X#XX
|
输出
输出一个数,整条队伍中被警察发现的小偷总数。
|
样例输出
3
|
时间限制
C/C++语言:2000MS
其它语言:4000MS
|
内存限制
C/C++语言:65536KB
其它语言:589824KB
|
package cn.com.jingdong;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
// 不妨利用数组T(此处用的是list)储存小偷的位置,顺序读取字符串,当读取到X即小偷时,向数组T中记录小偷位置。如:Ti=j表示队列位置j处有一个小偷,该小偷是顺序读取的第i个小偷。
List<Integer> list = new ArrayList<Integer>();
// 利用数组P记录警察的监视范围,数组P长度和字符串长度相同,初始状态均为0,顺序读取字符串,当遇到数字即警察时,
//令:Pjk= 1.....Pj+k= 1表示队列jk到j+k处于监视范围内。j表示警察的位置,k表示警察的监视范围。
int[] p = new int[n];
for (int i = 0; i < n; i++) {
char temp = str.charAt(i);
if (temp == 'X') {
list.add(i);
} else if ('1' <= temp && temp <= '9') {
int left = Math.max(0, i - (temp - '0'));
int right = Math.min(i + (temp - '0'), n - 1);
for (int x = left; x <= right; x++) {
p[x] = 1;
}
}
}
int count = 0;
//如果:PTi= 1表示第i个小偷处于监视范围内。令:count=count+ 1
for (int i = 0; i < list.size(); i++) {
if (p[list.get(i)] == 1) {
count++;
}
}
System.out.println(count);
}
}
方法二:
package cn.com.jingdong;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
char[] a = str.toCharArray();
int count = 0;
for (int i = 0; i < n; i++) {
char temp = a[i];
if ('1' <= temp && temp <= '9') {
//left,right为警察可以监视的范围
int left = Math.max(0, i - (temp - '0'));
int right = Math.min(i + (temp - '0'), n - 1);
for (int x = left; x <= right; x++) {
if(a[x]=='X'){//在可监视范围内,遇到小偷就+1,并把小偷转换为普通人,防止之后再多次技术
count++;
a[x]='#';
}
}
}
}
System.out.println(count);
System.out.println(str);
}
}
方法三:
package cn.com.jingdong;
import java.util.HashSet;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
HashSet<Integer> set = new HashSet<>();//存放可监视范围内的小偷所在位置索引,用set可以去除重复计数的小偷
for (int i = 0; i < n; i++) {
if (Character.isDigit(s.charAt(i))) {
int k = s.charAt(i) - '0';
if (k == 0)
continue;
int l = Math.max(0, i - k);
int r = Math.min(n - 1, i + k);
for (int x = l; x <= r; x++) {
if (s.charAt(x) == 'X')
set.add(x);
}
}
}
System.out.println(set.size());
}
}