记录一下两道编程题,有空的时候再看看
第一题:
有一种特殊的DNA,仅仅由核酸A和T组成,长度为n,顺次连接 科学家有一种新的手段,可以改变这种DNA。每一次,科学家可以交换该DNA上两个核酸的位置,也可以将某个特定位置的核酸修改为另一种核酸。 现在有一个DNA,科学家希望将其改造成另一种DNA,希望你计算最少的操作次数。 输入 输入包含两行,第一行为初始的DNA,第二行为目标DNA,保证长度相同。 输出 输出最少的操作次数 样例输入 ATTTAA TTAATT 样例输出 3 提示 对于100%的数据,DNA长度小于等于100000 样例解释: 1.首先修改第一个位置的核酸(从A修改为T) 2.交换3和5位置的核酸 3.交换4和6位置的核酸
ac:100%
import java.util.Scanner;
public class First {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String old = sc.nextLine();
String newStr = sc.nextLine();
int oldA = 0, newStrA = 0, tong = 0;
for(int i = 0; i < old.length(); i++){
if(old.charAt(i) == 'A'){
oldA++;
if(newStr.charAt(i) == 'A'){
tong++;
newStrA++;
continue;
}
}
if(newStr.charAt(i) == 'A'){
newStrA++;
}
}
if(oldA > newStrA){
System.out.println(oldA - tong);
} else {
System.out.println(newStrA - tong);
}
}
}
第二题:
A和B两个人在抽奖。现在有一个抽奖箱,里面有n张中奖票,m张不中奖票。A和B轮流从中抽一张奖票出来。如果有人抽到中奖票就结束,抽到中奖票的人胜利。抽过的奖票会被丢弃。 额外的,B每次抽后,会再次抽取一张票并丢弃掉(这张票中奖不算B胜利)。 现在,A先抽,请问A的胜率,保留4位小数后输出。 如果两人到最后也没有抽到中奖票算作B胜利。 输入 输入两个数字n,m,代表中奖票和不中奖票的数量 (0≤n,m≤1000) 输出 输出A的胜率,保留4位小数。 样例输入 2 3 样例输出 0.6000 提示 样例输入2 1 3 样例输出2 0.5000 样例二解释: 如果A第一轮抽到中奖票,A胜利,概率0.25。 如果A第二轮抽到中奖票,情况为A第一轮没有抽到中奖票,B也没有抽到中奖票,并且B丢弃掉的奖票也不是中奖票。概率为3/4 * 2/3 * 1/2=0.25 综上,中奖率为0.5。
ac:100%
import java.util.Scanner;
public class Second {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
double p = getP(n, m, 1.0);
System.out.println(String.format("%.4f",p));
}
public static double getP(int n, int m, double p){
//跳出条件
if(n == 0){
return 0;
} else if (m == 0) {
return p;
}
//方法体
double result = 0;
//A中奖
result += p * (new Double(n) / (n + m));
//A未中奖
m--;
//还有未中奖牌
if(m > 0){
//B未中奖
m--;
if(m > 0){
//B再抽一次未中奖
result += getP(n, m - 1,p * (new Double(m + 2) / (n + m + 2)) * (new Double(m + 1) / (n + m + 1)) * (new Double(m) / (n + m)));
//B再抽一次中奖
result += getP(n - 1, m,p * (new Double(m + 2) / (n + m + 2)) * (new Double(m + 1) / (n + m + 1)) * (new Double(n) / (n + m)));
}
}
return result;
}
}