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]纔有必要去交換