130805codeforces練習賽

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 ;
}



發佈了44 篇原創文章 · 獲贊 49 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章