130805codeforces练习赛

5 篇文章 0 订阅
2 篇文章 0 订阅

A.Marks

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define N 1000000007
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 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 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值