Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) ABCD

来源:互联网 发布:c语言学习文档 编辑:程序博客网 时间:2024/04/29 09:08

A.Vicious Keyboard
暴力枚举所有情况。统计最大值。

#include<bits/stdc++.h>using namespace std;char a[105];char b[105];char T[3]="VK";char S[105];int Next[105];int slen,tlen;void getNext(){    int j, k;    j = 0; k = -1; Next[0] = -1;    while(j < tlen)        if(k == -1 || T[j] == T[k])            Next[++j] = ++k;        else            k = Next[k];}int KMP_Count(){    int ans = 0;    int i, j = 0;    if(slen == 1 && tlen == 1)    {        if(S[0] == T[0])            return 1;        else            return 0;    }    for(i = 0; i < slen; i++)    {        while(j > 0 && S[i] != T[j])            j = Next[j];        if(S[i] == T[j])            j++;        if(j == tlen)        {            ans++;            j = Next[j];        }    }    return ans;}int main(){    scanf("%s",a);    int length=strlen(a);    slen=strlen(a);    tlen=strlen(T);    getNext();     strcpy(S,a);    int maxx=KMP_Count();    for(int i=0;i<length;i++){        strcpy(S,a);        if(S[i]=='V')            S[i]='K';        else            S[i]='V';        maxx=max(maxx,KMP_Count());    }    printf("%d",maxx);}

B.Valued Keys
扫一遍字符串,然后比对一下,如果出现目标字符串该位置的字符大于源字符串的,说明无解。

#include<bits/stdc++.h>using namespace std;char a[105];char b[105];char c[105];int main(){    scanf("%s%s",a,b);    int length=strlen(a);    for(int i=0;i<length;i++){        if(a[i]>=b[i]){           c[i]=b[i];        }else{        printf("-1");        return 0;        }    }    for(int i=0;i<length;i++)        printf("%c",c[i]);}

C.Voltage Keepsake
二分答案。check时所有的电器扫一遍,判断一起运行这么久他们需要的总电量,然后除以电源速度得到时间,对比后返回true或false,数据规模大,上届要设的很大。

#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;struct pos{    int a,b;}p[maxn];int n;double k;bool check(double x){    double sum=0;    for(int i=0;i<n;i++){        double temp;        temp=p[i].b-(double)p[i].a*x;        if(temp>=0)            continue;        temp=(-temp)/k;        sum+=temp;    }    if(sum>x)        return false;    else        return true;}int main(){    scanf("%d%lf",&n,&k);    double sum=0;    for(int i=0;i<n;i++){         scanf("%d%d",&p[i].a,&p[i].b);         sum+=(double)p[i].a;    }    if(k>=sum){        printf("-1");        return 0;    }    double l=0,r=1e11;    double ans=-1;    for(int i=1;i<=250;i++){        double mid=l+r;        mid=mid/2;        bool temp=check(mid);        if(temp){            l=mid;            ans=max(ans,mid);        }else{            r=mid;        }    }    printf("%f",ans);}

D.Volatile Kite
对于每个点,算出他与旁边两点确定的直线的距离。显然这个店能移动的距离就是点到直线距离的一半,即直线移动一半,点移动一半。扫一遍后得到最小值。

#include<bits/stdc++.h>using namespace std;const int maxn=1e3+10;struct pos{    double x,y;}p[maxn];int n;int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)    scanf("%lf%lf",&p[i].x,&p[i].y);    double ans=0x3f3f3f3f;    for(int i=0;i<n;i++){        pos a=p[i];        pos b=p[(i+1)%n];        pos c=p[(i+2)%n];        double dis=(double)(c.x-a.x)*(b.y-c.y)-(c.y-a.y)*(b.x-c.x);        if(dis<0)            dis=-dis;        dis=dis/(sqrt((c.x-a.x)*(c.x-a.x)+(c.y-a.y)*(c.y-a.y)));        dis=dis/2;        ans=min(ans,dis);    }    printf("%f",ans);}
0 0
原创粉丝点击