题目意思: 说这个题目之前先让我喷喷,太尼玛恶心了一道水题装B 的好像很有技术含量,真的是恶心。
题目给定一个字符串。每一个字符串由多个单词组成,现在有一个计算法则“ a = 1 , b = 2 ...... z = 26 ,‘a’ = 1 , “bz” = 26*32^0 + 2*32^1 = 90 类似32进制的转换” 然后要求我们去求出每一单词的值w ,排序满足 W1<W2<.......<Wn.
现在要求我么能否找到一个整数C ,使得:1 对于所以的Wi,Wj而言都有 C/WI % n != C/Wj % n;2 并且C是所以Wi中至少一个的倍数 3 如果有出现C/WI % n = C/Wj % n 时候就要令 C = Min( (C/WI+1) * Wi , (C/Wj+1) * Wj ); 直到求出最小的C
解题思路: 我么初始化C = 1 ;然后去做循环判断,由于要比较要两重循环,只要我们判断到 C/WI % n = C/Wj % n 我么就要去递归进行下一轮的判断,如果当找到C后就不会去 递归返回的时候直接return即可。对于单个字符提取,可以用split函数
代码:
//分割字符串我们使用split函数
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
#define MAXN 10000
char ch[MAXN] , Ch[MAXN];
int w[20];
int C , k;
//求出最小值
inline int Min(int a , int b){
return a < b ? a : b;
}
//判断求最小C
void solve() {
for (int i = 0 ; i < k ; i++) {
for (int j = i + 1 ; j < k ; j++) {
if ((C/w[i])%k == (C/w[j])%k){
C = Min((C/w[i]+1)*w[i] , (C/w[j]+1)*w[j]);
solve();//递归
return;//递归回来后说明找到了C则直接退出
}
}
}
}
//主函数
int main() {
//freopen("input.txt" , "r" , stdin);
int i , t;
while (gets(ch)) {
memcpy(Ch , ch , sizeof(ch));
memset(w, 0, sizeof (w));
const char* split = " " ; char *p;
p = strtok(ch, split);
int len = strlen(p);
for (k = 0,i = 0; i < len; i++) {
t = p[i] - 'a' + 1;
w[k] += t * pow(32, len - 1 - i);
}
k++;
while (p != NULL) {
p = strtok(NULL, split);
if (p == NULL) break;
int len = strlen(p);
for (i = 0; i < len; i++) {
t = p[i] - 'a' + 1;
w[k] += t * pow(32, len - 1 - i);
}
k++;
}
sort(w, w + k);
C = 1 ; solve();//C初始化为1,不为0即可
printf("%s\n" , Ch);
printf("%d\n\n" , C);
}
return 0;
}