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也得是荡气回肠!

原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/6731483.html