• Codeforces Round #426 (Div. 2)


    题目链接:http://codeforces.com/contest/834/problem/B

    题意:一共有26个门(A-Z表示),然后现在有n个人要走的门和k个守卫。每当有人要经过某个门时,门要一直打开直到最后一个要通过这扇门的人通过之后才关闭,并且在门打开的期间要有一个守卫看守,每个守卫只能看守一个门,当门关闭后守卫该门的守卫才能分配到其他的门。问你是否存在守卫不够用的情况。存在输出YES,否则输出NO。

    思路:由于只有26个门,那么记录每个门打开的时间点和关闭的时间点。当遇到门打开的时,k-1,当遇到门关闭时k+1,如果存在k<0说明守卫不够用了。

    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<queue>
    #include<vector>
    #include<time.h>
    #include<cmath>
    #include<set>
    #include<map>
    using namespace std;
    typedef long long int LL;
    const int MAXN = 1e6 + 24;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7;
    char str[MAXN];
    int st[26], ed[26];
    int main(){
        int n, k;
        while (~scanf("%d%d", &n,&k)){
            scanf("%s", str); 
            for (int i = 0; i < 26; i++){
                st[i] = ed[i] = -1;
            }
            for (int i = 0; i < n; i++){
                if (st[str[i] - 'A'] == -1){
                    st[str[i] - 'A'] = i;
                    ed[str[i] - 'A'] = i;
                }
                else{
                    ed[str[i] - 'A'] = max(ed[str[i]-'A'],i);
                }
            }
            bool flag = true;
            for (int i = 0; i < n&&flag; i++){
                if (st[str[i] - 'A'] == i){
                    k--;
                    if (k < 0){ flag = false; }
                }
                if (ed[str[i] - 'A'] == i){
                    k++;
                }
            }
            printf(flag ? "NO
    " : "YES
    ");
        }
        return 0;
    }
  • 相关阅读:
    使用MulticastSocket实现多点广播(实现多人聊天室)
    双目相机标定以及立体测距原理及OpenCV实现
    opencv5-objdetect之级联分类器
    OpenCV人脸识别--detectMultiScale函数
    简单eclipse配置opencv的方法
    Struts2之Action的配置
    Struts2入门
    用户管理系统网站框架改进之MVC模式
    Tomcat中设置数据源和连接池
    JSP第一个实例之用户管理系统
  • 原文地址:https://www.cnblogs.com/kirito520/p/7264102.html
Copyright © 2020-2023  润新知