洛谷 P5594 【XR-4】模拟赛

时间:2019-10-21 10:10:12   收藏:0   阅读:82

传送门

思路

这是一道真·水题,会模拟就好了

\(subtask1\):

\(n = m = k = 1\),很明显,这个部分分的答案就是\(1\),然后我们就顺利得到了\(13\)分的好成绩

后面的分数……似乎没有什么必要有,反正我是直接写的满分。那么我们来说一下满分思路

既然每个人在之后的\(k\)天中都有\(m\)天有空做模拟题,那我们就用一个结构体存第几天有空和第几套模拟题,如下

struct node {
    int x, num;
    //x表示输入的编号,即第几天有空,num表示这一天应该做哪一套模拟题
}a[N][N];

然后\(n^2\)输入之后我们就可以直接处理了,我们用一个\(vis\)数组,\(vis[i][j]\)表示第\(i\)天第\(j\)套模拟题有没有用过,直接套两层循环,判断\(a[i][j].x\)这天\(a[i][j].num\)这套模拟题有没有用过,如果没有用过,就将\(vis[a[i][j].x][a[i][j].num]\)设为访问过,让\(ans[i]++\),如果已经这天这套模拟题已经用过了就直接继续循环,时间复杂度\(O(n^2)\),空间复杂度\(O(n^2)\),然后这个题我们就做完了

是不是很水??上代码\(qwq\)

代码

/*
By:Loceaner
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
    return x * f;
}

const int N = 1e3 + 11;

struct node {
    int x, num;
} a[N][N];

int n, m, k, ans[N], vis[N][N];

int main() {
    n = read(), m = read(), k = read();
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++) {
            a[i][j].x = read();
            a[i][j].num = j;
        }
    for(int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++) 
            if(!vis[a[i][j].x][a[i][j].num]) {
                vis[a[i][j].x][a[i][j].num] = 1;
                ans[a[i][j].x]++;
            }
    for(int i = 1; i <= k; i++) printf("%d ", ans[i]);
    return 0;
}

原文:https://www.cnblogs.com/loceaner/p/11711323.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!