现在的位置: 首页 > 综合 > 正文

Codeforces Round #283 (Div. 1)

2018年01月22日 ⁄ 综合 ⁄ 共 796字 ⁄ 字号 评论关闭

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





抱歉!评论已关闭.