#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,判断是否满足题意
时间复杂度: