bjfu1250 模拟

这题貌似是蓝桥杯的一题改了个题面。

就是模拟啦,应该有比我的更简洁的方法。

我的方法是把所有的人(蚂蚁)按位置排完序以后从左往右看,每次有一个向左走的,就会把最左边的t出,这个变成向右中,同时,从左端到此位置的人都会相遇一遍,处理一下就好了。

不废话了,直接上代码

/*

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;



typedef struct People {

    bool sad;

    int x;

    People (int xx = 0, bool s = false) {

        sad = s;

        x = xx;

    }

} People;



bool inline operator<(const People& p1, const People& p2) {

    return abs(p1.x) < abs(p2.x);

}



const int MAXP = 55;

People pe[MAXP];

int N;



void run() {

    People *start = pe;

    People *end = &pe[N - 1];

    while (start < end && (*start).x < 0) {

        start++;

    }

    while (start < end) {

        People *p = start;

        while (p <= end && (*p).x > 0) {

            p++;

        }

        if (p > end) {

            break;

        }

        (*p).x = 0 - (*p).x;

        while (--p >= start) {

            (*p).sad = (*(p + 1)).sad = (*p).sad or (*(p + 1)).sad;

        }

        start++;

    }

}



int main() {

    int x;

    while (scanf("%d", &N) == 1) {

        memset(pe, 0, sizeof(pe));

        pe[0].sad = true;

        for (int i = 0; i < N; i++) {

            scanf("%d", &pe[i].x);

        }

        sort(pe, pe + N);

        run();

        int ans = 0;

        for (int i = 0; i < N; i++) {

            ans += pe[i].sad;

        }

        printf("%d\n", ans);

    }

    return 0;

}

 

你可能感兴趣的:(模拟)