第一題:字串轉化
字串的駝峰表示法僅將除第一個單詞外的單詞首字母大小,例如:myName。而下劃線表示法中所有單詞小寫,但是會用下劃線隔開,例如my_name。給出n個字串,若是駝峰表示法,將其轉化為下劃線表示法輸出,若是下劃線表示法則直接輸出,否則輸出"indistinct";
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
if ((s[0] >= 'A' && s[0] <= 'Z') || s[0] == '_'){
cout << "indistinct"<<endl;
continue;
}
string res;
bool camel = false;
bool down = false;
bool next = false;
for (char c:s) {
if (c >= 'A' && c <= 'Z') {
char nc = c + 32;
res = res + '_' + nc;
camel = true;
continue;
}
if (c =='_') {
if (next) {
camel = true;
}
down = true;
next = true;
}
else next = false;
res = res + c;
}
if ((camel && down) || next ) cout << "indistinct"<<endl;
else cout << res << endl;
}
return 0;
}
需要排除_開頭結尾、大寫字母開頭和連續下劃線的特殊情況
第二題:排列房子
小島上有n(n <= 15)間房子,每間房子都有著對應的價值,要求相鄰兩個房子的價值一定為整數倍(例如房子1的價值是2的倍數或房子2價值為1的倍數),請問有多少種排列
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int h[18];
for (int i = 0; i < n; i++) {
cin >> h[i];
}
//使用狀態壓縮表示排布方法
// dp[i][j] i表示當前集合,j表示前一個房子
int dp[100005][15];
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++) {
int s = (1 << i);
dp[s][i] = 1;
}
for (int i = 1; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if (i & (1 << j)) {
//列舉的dp[i][j]存在則找 dp[i - j][k],k則是與j滿足條件的房子
for (int k = 0; k < n; k++) {
if (((1 << k) & (i ^ (1 << j))) && (h[j] % h[k] == 0 || h[k] % h[j] == 0)) {
dp[i][j] += dp[i ^ (1 << j)][k];
}
}
}
}
}
int res = 0;
for (int i = 0; i < n; i++) {
res += dp[(1 << n) - 1][i];
}
cout << res;
return 0;
}