zoukankan      html  css  js  c++  java
  • Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) 题解

    A. 

    题意:给一个仅由‘V’ ,‘K’构成的串,允许修改一个字母,问最多出现几个VK.

    思路:先把相邻的"VK"添加入答案,并立下flag,表示不能被修改,然后尝试着修改"VV","KK"。

    hack: KV(这个栗子答案为0)

    #include <iostream>
    #include <cstring>
    using namespace std;
    char s[1002];
    int vis[1002];
    int main()
    {
        scanf("%s", s+1);
        int n = strlen(s+1), ans = 0;
        for(int i=1;i<n;i++)
        {
            if(s[i] == 'V' && s[i+1] == 'K')
            {
                ans ++;
                vis[i] = 1, vis[i+1] = 1;
            }
        }
        for(int i=1;i<n;i++)
        {
            if(vis[i] == 0 && vis[i+1] == 0)
            {
                if((s[i]=='V'&&s[i+1]=='V') || (s[i]=='K'&&s[i+1]=='K')) 
                {
                    ans ++;
                    break;
                }
            }
        }
        cout << ans << endl;
    }
    

      

    B. 

    一道休闲的构造题~ 

    #include <iostream>
    #include <vector>
    #include <cstring>
    using namespace std;
    char s1[1002], s2[1002];
    vector<char> v;
    int main()
    {
        scanf("%s", s1+1);
        scanf("%s", s2+1);
        int n = strlen(s1+1);
        for(int i=1;i<=n;i++)
        {
            if(s1[i] == s2[i])
            {
                v.push_back('z');
            } else if(s1[i] > s2[i]) {
                v.push_back(s2[i]);
            } else {
                printf("-1
    ");
                return 0;
            }
        }
        for(int i=0;i<v.size();i++)
        {
            printf("%c", v[i]);
        }
    }
    

      

    C. 

    题意:

    一堆神秘设备在耗电,每分钟每个设备消耗a[i]单位的电,初始电量为a[i],现在你有一个充电器,

    每分钟可以给一个设备充p个单位的电。如果有一个设备没电了,就gg了,问最长可以苟多久。

    思路:二分答案~

    判断能不能苟住t分钟的姿势:

    如果一个设备t分钟后电量为正,那恭喜!如果为负,说明需要充电器的拯救,需要充电的时间为:

    (t*b[i] - a[i]) / p。对这些设备需要的时间求和,然后和t比较大小即可。

    #include <iostream>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int NICO = 100000 + 10;
    int n, p, a[NICO], b[NICO];
    
    bool ok(double t)
    {
        double need = 0;
        double ans = 0;
        for(int i=1;i<=n;i++) 
        {
            need = (double)a[i] * t - (double)b[i];
            if(need > 0)
            {
                ans += need / (double)p;
            }
        }
        return (ans + 1e-10) < t;
    }
    
    int main()
    {   
        scanf("%d %d", &n, &p);
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d", &a[i], &b[i]);
        }
        double l = 0, r = 1e14;
        for(int i=1;i<=300;i++)
        {
            double mid = (l+r)/2;
            if(ok(mid)) l = mid;
            else r = mid;
        }
        if(ok(1e14))
        {
            printf("-1
    ");
            return 0;
        }
        printf("%.8f
    ", l);
    }
    

      

    D.

    题意:给一个凸多边形,现在每个点都可以在半径为D的范围内乱动,如果要保证,无论怎么

    动,凸多边形都不会凹掉,求D的最大值。

    题解:动三个点就可以啦!求出一个点,到它的邻居之间的连线的距离。然后有缘千里来相会~

    所以距离为 min{dis} / 2

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <cstring>
    using namespace std;
    const int NICO = 1002;
    struct point 
    {
        double x,y;
    };
    struct line
    {
         point a,b;
    };
    
    double xmult(point p1,point p2,point p0)
    {
        return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    
    double distance(point p1,point p2)
    {
         return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }
    
    double disptoline(point p,line l)
    {
        return fabs(xmult(p,l.a,l.b))/distance(l.a,l.b);
    }
    
    point p[NICO];
    int n;
    int main()
    {
        scanf("%d", &n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lf %lf", &p[i].x, &p[i].y);
        }
        double ans = 1e18;
        for(int i=1;i<=n;i++)
        {
            point now = p[i], pre1, pre2, nxt1, nxt2;
            if(i>1)
                pre1 = p[i-1];
            else 
                pre1 = p[i-1+n];
    
            if(i>2)
                pre2 = p[i-2];
            else
                pre2 = p[i-2+n];
            
            if(i+1<=n)
                nxt1 = p[i+1];
            else 
                nxt1 = p[i+1-n];
            
            if(i+2<=n)
                nxt2 = p[i+2];
            else 
                nxt2 = p[i+2-n];
    
            line l1, l2, l3;
            l1.a = pre1, l1.b = nxt1;
            l2.a = pre1, l2.b = pre2;
            l3.a = nxt1, l3.b = nxt2;
            ans = min(ans, disptoline(now, l1));
            ans = min(ans, disptoline(now, l2));
            ans = min(ans, disptoline(now, l3));
        }
        printf("%.10f
    ", ans/2);
    }
    

      

    E.  

    题意:

    构造一个满足如下条件的串:

    1.所有数字小于m

    2.前缀积%m的值互不相同。

    3.前缀积%m的值不等于{a[1], a[2], ...., a[n]}中的任意一个。

    4.尽可能长

    思路:

    每个数字看成一个节点。

    若 kx % m = y 那么x,y之间可连一条边。然后这个问题就转换成了求在有向图中,每个点只能经过一次

    最远能走多远。 又发现,如果kx % m = y那么 gcd(m, x) | gcd(m, y)

    然后就不知道怎么搞了。比赛完后题解里大致有个强连通分量分解什么的。。抽个时间把这道题的题解,还有

    强连通分量blabla补一补。也许....大概....明天吧~。


    用小号走了一发。。。心旷神怡! 

    然后,这个号的主人是上面那货。。。

    嗯,采访一下,排骨龙先生,请问对这次比赛自己的表现有什么看法?

    排骨龙:比赛之前睡了个好觉,嗑了很多瓜子,所以心情比较愉悦。比赛一上来,A题直接

    弹出一个WA,吓得我钻到了木屑里,不过幸运的是,之后调整了状态,打出一波流。比赛

    下半场啥也没搞出来。感觉E题自己的姿势还远不够,图论思想方面还是太智障了。下一段

    时间得学习一个强连通分量~

    听外界消息说,下一场CF,你要上紫名,这是真的吗?

    排骨龙:当然啦!不过啊,其实Rating啥的也不必太在意啦!切题的感觉就像跑轮子一样,

    细细品味过程,自己才会有在星汉灿烂中奔跑的愉悦感,所以下一场,希望自己能更洒脱

    更放肆地coding,多challange一下E,F,哪怕是打出GG也得是荡气回肠!

  • 相关阅读:
    PHP格式化时间戳函数分享
    The Mac App Store isn't working. How to fix?
    sqlite+ef+powertools
    部署node api的二三事
    node 写api几个简单的问题
    基于项目的简单的代码生成器
    h5跳转到app的实现
    几种常用的git命令
    发送post请求几种常见content-type类型
    cors(Cross-origin resource sharing)跨域资源共享
  • 原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/6731483.html
Copyright © 2011-2022 走看看