【codeforces 411B】Multi-core Processor

【题目链接】:http://codeforces.com/problemset/problem/411/B

【题意】

处理器有n个核;然后有k个存储单元;
有m轮工作;每轮工作都会给每个核确定一个数字;
这个数字是这个核这轮工作会填的储存单元的编号x(1< x< k)
一轮工作可能有多个核去填同一个存储单元;
这种情况出现时,我们规定填这个存储单元的所有的核都被锁定;
同时这个存储单元也被锁定;
下次如果还有核去填这个存储单元的话,不论有没有多个核去填它,它都会被锁定;
(核被锁定之后忽略后面的操作);
要求你输出最后每个核被锁定与否;

【题解】

一轮一轮地模拟就好;
每次填一个存储单元之后;
就在那个存储单元里面(vector)push_back这个核;
每轮扫一遍所有存储单元;
对那些已经被锁定的存储单元以及核的个数超过1个的存储单元进行锁核的操作就好;
存储单元别忘了锁;

【Number Of WA

0

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110;

int n,m,k,a[N][N];
int core[N],cell[N];
vector <int> tcell[N];

int main(){
    //Open();
    Close();
    cin >> n >> m >> k;
    rep1(i,1,n){
        rep1(j,1,m){
            cin >> a[i][j];
        }
    }
    rep1(j,1,m){
        rep1(i,1,k) tcell[i].clear();
        rep1(i,1,n){
            if (core[i]) continue;
            tcell[a[i][j]].pb(i);
        }
        rep1(i,1,k){
            if ( (int) tcell[i].size() > 1 || cell[i]){
                rep1(l,0,(int) tcell[i].size()-1){
                    core[tcell[i][l]] = j;
                }
                if (!cell[i]) cell[i] = j;
            }
        }
    }
    rep1(i,1,n)
        cout << core[i] << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626253.html