1. 编译器找ID总数
小华设计了一种编译语言最大支持N个字不同的字符,由这些字符组成的ID长度范围是“1<length<L”,求设计的语言最多能组成多少个ID。
- 思路:大数取模 + 组合数
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Long mod = 1000000007l;
while (input.hasNext()) {
Long n = input.nextLong();
Long l = input.nextLong();
if (n == 0 && l == 0) {
break;
}
Long sum = 0l;
Long k = n;
while(l>0){
sum+=k;
sum%=mod;
k=k*n%mod;
l--;
}
System.out.println(sum);
}
}
}
结果ac
2.最大的二进制字符串
已知由0和1组成的字符串长度为n,可以进行以下两种操作:
(1)遇到任意“00”可以改变为“10”;
(2)遇到任意“10”可以改变为“01”
通过一波操作求此二进制数字最大为多少?
- 思路:重点是判断两种条件,第一种直接换总是会更大,使用第二种操作的前提是“10”前面是“0”,才能保证换过之后ch[k]和ch[k+1]可以进行第一个操作,让字符串的值变大。
import java.util.Scanner;
public class Test2{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int t = input.nextInt();
for(int i=0; i<t; i++) {
int n = input.nextInt();
String s = input.next();
char[] ch = new char[10000];
for (int j=0; j<n; j++) {
ch[j] = s.charAt(j);
}
for (int k=0; k<n; k++) {
if (ch[k] == '0' && ch[k + 1] == '0') ch[k] = '1';
else if(ch[k]=='0' && ch[k+1] == '1' && ch[k+2] == '0'){
ch[k] = '1'; ch[k+1] = '0';ch[k+2] = '1';
}
}
for (int k = 0; k < n; k++) {
System.out.print(ch[k]);
}
System.out.println();
}
}
}
结果是case通过了70%;考完之后继续想,觉得应该是“10”变“01”情况的边界考虑不周。 只有在k+2 < n时,ch[k+2]才有必要去交换