Codeforces Beta Round #108 (Div2)

A - Marks

题意:

有n名同学,每名同学对应都有m个成绩,如果一名同学的一科成绩是最高的,成为他是成功的,现在要求出所有成功的同学的数量。

思路:

先枚举每一列,求出每一列中的最大值,然后暴力枚举,如果枚举到的一名同学的这科成绩等于最大值,数量就加一,同时要用st数组判重,如果这个同学之前被选进答案了,以后就不算他了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int>PII;

const int N = 110;

int n, m;
char str[N][N];
int f[N];
int s[N][N];
bool st[N];

int main()
{
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cin >> str[i][j], s[i][j] = str[i][j] - '0';
    }


    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            f[j] = max(f[j], s[i][j]);

    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (s[i][j] >= f[j] && !st[i])
            {
                cnt++;
                st[i] = true;
            }

        }
    }
    cout << cnt << endl;

    return 0;
}

B - Steps

题意:

给你初始位于的坐标x0,y0,以及可以到达的最大x y值n和m,之后的k行,每行给出一个向量,现在要顺着向量方向移动,求不超过最大n m最多可以走多少步

思路:

正常模拟会TLE,正确思路是根据每个dx,dy的特点进行讨论,最大能走到步数应该是在dx或者dy方向上的最小值t,然后x的增量就是x+=t*dx,y+=t*dy。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int>PII;

int main()
{
    int n, m, k;
    cin >> n >> m;
    int x0, y0;
    cin >> x0 >> y0 >> k;

    LL step = 0;
    LL tx, ty, t;
    while (k--)
    {
        int dx, dy;
        cin >> dx >> dy;

        if (dx == 0) tx = 0x3f3f3f3f;
        else if (dx < 0) tx = (x0 - 1) / (-dx);
        else tx = (n - x0) / dx;

        if (dy == 0) ty = 0x3f3f3f3f;
        else if (dy < 0) ty = (y0 - 1) / (-dy);
        else ty = (m - y0) / dy;

        t = min(tx, ty);
        x0 += t * dx;
        y0 += t * dy;

        step += t;
    }

    cout << step << endl;

    return 0;
}

 

C - Pocket Book

题意:

给你n个字符串,每个字符串的长度为m,k的范围是1到m,问如果每个字符串可以与其他字符串交换前缀的k个字母,求可以形成的不同字符串数量是多少

思路;

实际上就是求可以组合多少个不同的字符串。注意到其实每一列的各个字母都是可以互相调换的,其实就是统计每一列中的不同的字母数,a1,a2,...am。那么结果就是 a1*a2****am

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int>PII;

const int N = 110;

int n, m;
char str[N][N];
int cnt[N][N];
int dif[N];

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            cin >> str[i][j];
            cnt[j][str[i][j]] ++;
            if(cnt[j][str[i][j]] == 1)
                dif[j] ++;
        }

    LL res = 1;
    for (int j = 0; j < m; j++) res = (res * dif[j]) % 1000000007;

    cout << res << endl;
    
    return 0;
}

 

上一篇:汇编练习:求向量和


下一篇:带你用汇编写循序