130805codeforces练习赛

来源:互联网 发布:压力测试软件 web 编辑:程序博客网 时间:2024/05/21 01:56

A.Marks

基础题,找每列的最大字母。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>#define N 1000000007using namespace std;inline void RD(int &ret){    char c;    do    {        c=getchar();    }    while(c<'0'||c>'9');    ret=c-'0';    while((c=getchar())>='0'&&c<='9')    {        ret=ret*10+(c-'0');    }}inline void OT(int a){    if(a>=10)    {        OT(a/10);    }    putchar(a%10+'0');}int main(){    int n,m,i,j,y[111],z;    char M,x[111][111];    RD(n);    RD(m);    memset(y,0,sizeof(y));    for(i=0;i<n;++i)    {        scanf("%s",x[i]);    }    for(j=0;j<m;++j)    {        M='0';        for(i=0;i<n;++i)        {            if(x[i][j]>=M)            {                M=x[i][j];            }        }        for(i=0;i<n;++i)        {            if(x[i][j]==M)            {                y[i]++;            }        }    }    z=0;    for(i=0;i<n;++i)    {        if(y[i]>0)        {            z++;        }    }    OT(z);    printf("\n");    return 0 ;}

B.Steps

模拟,每次走最大步就行,可我想复杂了,用二分枚举写了,WA了一发,改了二分次数就过了。。。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>using namespace std;inline void RD(int &ret){    char c;    do    {        c=getchar();    }    while(c<'0'||c>'9');    ret=c-'0';    while((c=getchar())>='0'&&c<='9')    {        ret=ret*10+(c-'0');    }}inline void OT(int a){    if(a>=10)    {        OT(a/10);    }    putchar(a%10+'0');}int main(){    int k,i,j;    long long xc,yc,high,low,mid,x[10001],y[10001],n,m,ans;    cin>>n>>m>>xc>>yc>>k;    for(i=0; i<k; ++i)    {        cin>>x[i]>>y[i];    }    ans=0;    for(i=0; i<k; ++i)    {        low=0;        high=1000000000;        j=0;        while(low<high)        {            mid=(low+high)/2;            if((xc+x[i]*mid)>=1&&(xc+x[i]*mid)<=n&&(yc+y[i]*mid)>=1&&(yc+y[i]*mid)<=m)            {                low=mid;            }            else            {                high=mid;            }            j++;            if(j==40)            {                break;            }        }        for(j=high; j>=low; --j)        {            if((xc+x[i]*j)>=1&&(xc+x[i]*j)<=n&&(yc+y[i]*j)>=1&&(yc+y[i]*j)<=m)            {                ans+=j;                xc+=x[i]*j;                yc+=y[i]*j;                break;            }        }    }    cout<<ans<<endl;    return 0 ;}


C.Pocket Book

排列组合题,只要求每列的不同字母数在相乘就行了。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>#include<set>using namespace std;inline void RD(int &ret){    char c;    do    {        c=getchar();    }    while(c<'0'||c>'9');    ret=c-'0';    while((c=getchar())>='0'&&c<='9')    {        ret=ret*10+(c-'0');    }}inline void OT(int a){    if(a>=10)    {        OT(a/10);    }    putchar(a%10+'0');}int main(){    set<char>a[111];    int n,m,i,j;    char x[101];    long long ans=1;    RD(n);    RD(m);    for(i=0;i<n;++i)    {        scanf("%s",&x);        for(j=0;j<m;++j)        {            a[j].insert(x[j]);        }    }    for(i=0;i<m;++i)    {        ans=ans*(a[i].size())%1000000007;    }    cout<<ans<<endl;    return 0 ;}