#include <cstdio>
#include <cstring>
char tab[111][111];
bool ok[111];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%s", &tab[i]);
int cnt = 0;
for (int i = 0; i < m; i++) ok[i] = 1;
for (int i = 0; i < m; i++) {
for (int j = 1; j < n; j++) {
if (tab[j][i] < tab[j-1][i]) {
bool add = true;
for (int k = 0; k < i; k++) {
if (ok[k] == 1 && tab[j-1][k] < tab[j][k])
add = false;
}
if (add) { cnt++; ok [i] = 0; break;}
}
}
}
printf("%d\n", cnt);
return 0;
}
两个人打比赛,如果一个人先赢到t分,那么他获胜一场,当一个人赢s场后,这个人获得胜利。
输入数据k,接下来有k个数:如果为1,则代表第一个人赢1分,如果为2,则代表第二个人赢1
分,现在给出一场比赛的分数序列,求s,和t的所有可能
input
5
1 2 1 2 1
output
1 3
3 1
1 3 第一个人赢了3分后,获胜一场,恰有s = 1,获胜一场后赢得了胜利
3 1 第一个人赢了3个1分,获胜了三场,有s = 3,获胜三场后赢得了胜利
====
想法:如果序列中1和2的个数相等,那么就没有人获胜,输出0
如果序列中的1和2的个数不想等,那么一定是赢得分数多的那个人获胜,并假设他赢了m场
因为打了k场,所以不可能在k场之前分出胜负,所以s*t一定等于m
然后枚举t,根据s = m / t,求出s,判断是否满足题意
时间复杂度: