zoukankan      html  css  js  c++  java
  • 取尺法专题

    链接:https://ac.nowcoder.com/acm/contest/3002/G
    来源:牛客网

    eli拿到了一个仅由小写字母组成的字符串。
    她想截取一段连续子串,这个子串包含至少  个相同的某个字母
    她想知道,子串的长度最小值是多少?
    注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串arcaea”而言,arc”、rcae”都是其子串。而“car”、aa”则不是它的子串。

    #define Inf 0x3f3f3f3f
    #define maxn 250015
    #define ll long long
    #define PI acos(-1.0)
    #define lowbit(x) (x&-x)
    #define P pair<ll, pair<ll, ll> >
    #define EPS 1e-8
    const int N = 2005;
    int n, m, k, len, ans, cost;
    char str[maxn];
    map<char, int>mp;
    int main(){
        while(~scanf("%d%d", &n, &k)){
            scanf("%s", str);
            mp.clear();
            int l = 0, r = 0;
            int res = Inf;
            while(1){
                while(r < n && mp[str[r]] < k){ //mp记录每个字符出现的次数,直到k
                    mp[str[++r]] ++;
                }
                if(r >= n && mp[str[r]] < k){ //若右端点到达终点则退出
                    break;
                }
                res = min(res, r-l); //记录最短长度
                mp[str[l++]] --; //压缩长度
            }
            if(res != Inf)
                printf("%d
    ", res+1);
            else
                printf("-1
    ");
        }
        return 0;
    }
    View Code
    链接:https://ac.nowcoder.com/acm/contest/3002/C
    来源:牛客网

    umi对弓道非常痴迷。
    有一天,她在研究一个射箭问题:
    在一个无限大的平面中,她站在  这个坐标。
      个靶子,第  个靶子的坐标是 
    umi准备在  轴或  轴上放置一块挡板来挡住弓箭的轨迹,使得她可以射中的靶子数量不超过  个。
    她想知道挡板的最短长度是多少?
    注:假定弓箭的轨迹是起点为umi坐标、长度无穷大的射线。umi和靶子的体积可以无视。挡板的边缘碰到弓箭轨迹也可视为挡住弓箭。
    注2:挡板不能弯折,起始和终点必须在同一坐标轴上。

    首先确定umi所在位置的象限。很明显同一象限的点是不可能用挡板挡掉的,对于剩下的点找出线段和 xx 轴或 yy 轴的交点,统计坐标位置(如果存在交点的话)。
    之后双指针维护 xx 轴上或者 yy 轴挡住 n-k个点的挡板长度最小值。注意 x 轴和 y 轴要分开计算。
     
    double xx, yy, x, y;
    vector<double>v1, v2;
    int main(){
        scanf("%lf%lf%d%d", &xx, &yy, &n, &k);
        v1.clear(), v2.clear();
        for(int i = 0; i < n; i ++){
            scanf("%lf%lf", &x, &y);
            if(x*xx < 0){
                v2.push_back(yy-xx*(y-yy)/(x-xx)); //计算线段与轴交点
            }
            if(y*yy < 0){
                v1.push_back(xx-yy*(x-xx)/(y-yy)); //与轴交点
            }
        }
        k = n-k; //处理剩下的n-k个点即可
        double res = Inf;
        if(v1.size() >= k){
            int i = 0, j = k-1; //以n-k为长度移动
            sort(v1.begin(), v1.end());
            while(j < v1.size()){
                res = min(res, v1[j++]-v1[i++]);
            }
        }
        if(v2.size() >= k){
            int i = 0, j = k-1;
            sort(v2.begin(), v2.end());
            while(j < v2.size()){
                res = min(res, v2[j++]-v2[i++]);
            }
        }
        if(res < Inf)
            printf("%.8lf
    ", res);
        else
            printf("-1
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    div+css清除浮动代码
    JavaScript for循环实现表格隔行变色
    JavaScript 四种显示数据方式
    table表格隔行变色
    table表格用tbody新属性获取DOM元素
    条形图
    子图--面向对象
    线的形状
    matplotlib--直线和点
    颜色和样式字符串
  • 原文地址:https://www.cnblogs.com/microcodes/p/12319300.html
Copyright © 2011-2022 走看看