2021.5.22 vj补题

A - Marks

CodeForces - 152A

题意:给出一个学生人数n,每个学生的m个学科成绩(成绩从1到9)没有空格排列给出。在每科中都有成绩最好的人或者并列,求出最好成绩的人数

思路:求每列成绩中最大的数的个数。求出每列成绩中的最大值,遍历每列的各行若值与最大值一样就用另一个数组标记出来,最后遍历标记数组记录下总个数,即为最终结果。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    char s[n+5][m+5];
    for(int i=0;i<n;i++)
    {
        scanf("%s",&s[i]);
    }
    int b[n+5],ct=0;
    memset(b,0,sizeof(b));
    for(int j=0;j<m;j++)
    {
        int maxx;
        maxx=s[0][j]-'0';
        for(int i=0;i<n;i++)
        {
            maxx=max(s[i][j]-'0',maxx);
        }
        //cout<<maxx<<endl;
        for(int i=0;i<n;i++)
        {
            if(s[i][j]-'0'==maxx)
            {
                b[i]=1;
                //cout<<" "<<i<<endl;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==1)ct++;
    }
    cout<<ct<<endl;
}
View Code

B - Steps

CodeForces - 152B

题意:给出一个方格的格式为n*m,一开始V位于(x,y)处,给出k个向量,对于每个向量都一直按向量的方向移动,但不能走出方格,当要出方格时就停止移动,再进行下一个向量的移动,运行完k次,求V一共移动了多少步。

题解:对于每一次的移动,分横轴和纵轴的两种情况算出在方格允许的范围内可移动的次数a,b,算出两个的最小次数t=min(a,b),求出变化后的x,y,记录下移动的步数s+=t;依次进行k次,求出总s即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n,m;
    cin>>n>>m;
    ll x,y;
    cin>>x>>y;
    int k;
    cin>>k;
    ll s=0;
    while(k--)
    {
        ll dx,dy,t,a,b;
        cin>>dx>>dy;
        if(dx<0)
        {
            a=(x-1)/-dx;
        }
        else if(dx>0)
        {
            a=(n-x)/dx;
        }
        if(dy<0)
        {
            b=(y-1)/-dy;
        }
        else if(dy>0)
        {
            b=(m-y)/dy;
        }
        if(dx==0||dy==0)
        {
            t=dx==0?b:a;
        }
        else t=min(a,b);
        //cout<<t<<" ";
        x=x+dx*t;
        y=y+dy*t;
        s+=t;
    }
    cout<<s<<endl;
}

C - Pocket Book

CodeForces - 152C

题意:给出n个字符串,每个字符串长度为m,每两串的前k(1=<k<=m)个字符可以进行交换,求有多少种不同的字符串。

题解:找规律,可以发现每列不同字符的个数相乘,即为最终结果。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    char s[110][110];
    for(int i=0;i<n;i++)
    {
        scanf("%s",&s[i]);
        //puts(s[i]);
    }
    long long ct=1,w;
    int b[1000];
    for(int j=0;j<m;j++)
    {
        memset(b,0,sizeof(b));
        w=0;
        for(int i=0;i<n;i++)
        {
            if(b[s[i][j]-'A']==0)
            {
                ++w;
                b[s[i][j]-'A']=1;
            }
        }
        ct=ct*w;
        ct%=1000000007;
        //cout<<w<<endl;
    }
    printf("%lld\n",ct);
}

 

posted @ 2021-05-25 20:16  西瓜0  阅读(117)  评论(0)    收藏  举报